本文首发于微信公众号「Android开发之旅」,欢迎关注 ,获取更多技术干货
Room是Jetpack组件库一员,属于ORM库,主要是对Sqlite做了一层抽象,从而简化开发者对数据库操作。Room支持编译时的语法检查,并且支持返回LiveData。
添加依赖
在app的build.gradle中添加如下依赖:
def room_version = "2.2.0-rc01"
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,必须要了解最基础的三个概念:
- Entity:实体类,对应的是数据库的一张表结构。需要使用注解 @Entity 标记。
- Dao:包含访问一系列访问数据库的方法。需要使用注解 @Dao 标记。
- Database:数据库持有者,作为与应用持久化相关数据的底层连接的主要接入点。需要使用注解 @Database 标记。
使用@Database注解需满足以下条件:
定义的类必须是一个继承于RoomDatabase的抽象类。
在注解中需要定义与数据库相关联的实体类列表。
包含一个没有参数的抽象方法并且返回一个带有注解的 @Dao。
三者之间和应用的对应关系如下图:
![](https://oss.jqhtml.com/wp-content/uploads/2020/7/MRnQ3e.png)
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
)
比如这里我们定义了一个User类。这里使用了@Entity、@PrimaryKey、@ColumnInfo和@Ignore
在@Entity注解中我们传入了一个参数 tableName用来指定表的名称。@PrimaryKey注解用来标注表的主键,并且使用autoGenerate = true 来指定了主键自增长。@ColumnInfo注解用来标注表对应的列的信息比如表名、默认值等等。@Ignore 注解顾名思义就是忽略这个字段,使用了这个注解的字段将不会在数据库中生成对应的列信息。也可以使用@Entity注解中的 ignoredColumns 参数来指定,效果是一样的。
除了以上使用的参数字段外,注解还有其他的参数,下面我来看下相关源码了解下其他的参数。