一、前言
Room是Jetpack组件库一员,属于ORM库,主要是对Sqlite做了一层抽象,从而简化开发者对数据库操作。Room支持编译时的语法检查,并且支持返回LiveData。官网说明
二、添加依赖
在app的build.gradle最前面加入
apply plugin: 'kotlin-kapt'
在app的build.gradle中添加如下依赖:
def room_version = "2.2.5"
implementation "androidx.room:room-runtime:$room_version"
// For Kotlin use kapt instead of annotationProcessor (注意这个注释)
kapt "androidx.room:room-compiler:$room_version"
如果项目是使用Kotlin语言来开发的,在添加room-compiler的时候使用kapt关键字,java语言开发的就使用annotationProcessor关键。否则会导致访问出错。
Room 具有以下注解处理器选项:
- room.schemaLocation:配置并启用将数据库架构导出到给定目录中的 JSON 文件的功能。如需了解详情,请参阅 Room 迁移。
- room.incremental:启用 Gradle 增量注解处理器。
- room.expandProjection:配置 Room 以重写查询,使其顶部星形投影在展开后仅包含 DAO 方法返回类型中定义的列。
android {
...
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments += [
"room.schemaLocation":"$projectDir/schemas".toString(),
"room.incremental":"true",
"room.expandProjection":"true"]
}
}
}
}
三、重要概念
要想使用Room,必须要了解最基础的三个概念:
- Entity:实体类,对应的是数据库的一张表结构。需要使用注解 @Entity 标记。
- Dao:包含访问一系列访问数据库的方法。需要使用注解 @Dao 标记。
- Database:数据库持有者,作为与应用持久化相关数据的底层连接的主要接入点。需要使用注解 @Database 标记。
3.1 Entity
使用 @Entity注解定义的类会被映射为数据库中的一张表。默认实体类的类名为表名,字段名为表名。当然我们也是可以修改的。
@Entity(tableName = "users")
data class User(
@PrimaryKey(autoGenerate = true) var userId: Long,
@ColumnInfo(name = "user_name")var userName: String,
@ColumnInfo(defaultValue = "china") var address: String,
@Ignore var sex: Boolean
)
注解解释
- @Entity注解中我们传入了一个参数 tableName用来指定表的名称。
- @PrimaryKey注解用来标注表的主键,并且使用autoGenerate = true 来指定了主键自增长。
- @ColumnInfo注解用来标注表对应的列的信息比如表名、默认值等等。
- @Ignore 注解顾名思义就是忽略这个字段,使用了这个注解的字段将不会在数据库中生成对应的列信息。
除了以上使用的参数字段外,注解还有其他的参数可查看源码
3.2 Dao
Dao类是一个 interface,其中定义了一系列的操作数据库的方法。通常我们操作数据库无非就是增删改查。Room也为我们的提供了相关的注解,有 @Insert、@Delete、@Update 和 @Query。
@Dao
public interface UserDao {
@Query("select * from user where userId = :id")
fun getUserById(id: Long): User
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun addUser(user: User)