Android 系统中使用的数据库是 SQLite 关系型数据库 , 使用 Android 提供的 api 访问 SQLite 数据库非常繁琐 , 由此出现了很多 ORM 框架 ;
ORM 英文全称 Object Relational Mapping , 对象关系映射 ;
对象关系映射 ORM 是一种编程技术 , 面向对象编程语言 与 关系型数据库 之间的 映射 ;
借助 ORM 对象关系映射 框架 访问数据库 , 可以 简化数据库操作流程 , 开发人员使用面向对象 API 与 数据库进行交互 , 比编写复杂的 SQL 语句操作数据库 要简单很多 ;
ORM 框架常使用 元数据 将 数据库表 与 编程语言中的类 进行映射 , 数据库表字段 与 类中的字段 一一对应 , 常用的元数据有 :
ORM 框架优点 :
常见的 ORM 框架 :
在 Android 中 , Google 官方提供了一个基于 SQLite 关系型数据库操作封装的 ORM 框架 , Room 框架 ;
Room 框架中的重要注解 :
Database 数据库持有者 , Dao ( Data Access Objects ) 数据库访问对象 , Entity 实体类 , 三者之间的关系如下 :
Room 框架使用步骤 :
在 Module 模块下的 build.gradle 构建脚本 中 , 配置如下依赖项 :
dependencies {
// 配置 Room 框架版本号
def room_version = "2.4.0"
// 核心运行时依赖库 在应用运行时提供 Room 框架的数据库相关核心功能
implementation "androidx.room:room-runtime:$room_version"
// 编译时依赖项 在编译时实时生成 Room 代码 如 : Dao 实现类 / AppDatabase 子类 / Entity 实体类映射器
annotationProcessor "androidx.room:room-compiler:$room_version"
// 可选配置项 - 支持 Kotlin 扩展和协程的 Room 框架 如果使用的是 Kotlin 语言必须导入该依赖
implementation "androidx.room:room-ktx:$room_version"
}
androidx.room:room-runtime 依赖库 是 运行时核心依赖库 , 在应用运行时提供 Room 框架的数据库相关核心功能 ; 该依赖库 包含了 Room 持久化库的核心功能 , 如 :
androidx.room:room-compiler 依赖库 是 Room 持久化库中的一个 编译时依赖项 , 用于 在编译时生成 Room 的如下实现代码 :
androidx.room:room-ktx 依赖库 , 提供了 Kotlin 扩展功能 , 如果使用的是 Kotlin 语言 , 则必须导入该依赖库 ;
创建 Entity 实体类 , 该实体类对应着数据库中的一张表 , 需要使用如下注解修饰
@Entity(tableName = "users")
data class User(
@PrimaryKey val id: Int,
@ColumnInfo(name = "name") val name: String,
@ColumnInfo(name = "age") val age: Int
)
创建 Dao 实体类 : 创建用于访问数据库的 DAO 接口 , 并使用注解指定 SQL 查询语句等信息 ;
@Dao
interface UserDao {
@Query("SELECT * FROM users")
fun getAll(): List<User>
@Insert
fun insert(user: User)
@Delete
fun delete(user: User)
}
创建 RoomDatabase 数据库实例对象 : 创建 RoomDatabase 的子类实例对象 , 并定义抽象方法以获取 DAO 实例 ;
@Database(entities = arrayOf(User::class), version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
初始化数据库 : 在应用程序中使用 Room 数据库之前 , 必须先创建数据库实例 ;
val db = Room.databaseBuilder(
applicationContext,
AppDatabase::class.java, "database-name"
).build()
调用 Dao 执行数据库增删改查操作 :
db.userDao().insert(User(1, "John", 25))
val users = db.userDao().getAll()