使用Room将数据保存到本地数据库
简介
Room持久库在SQLite之上提供了一个抽象层,以便在充分利用SQLite的强大功能的同时,能够流畅的访问数据库,具体来说,Room有以下优点:
- SQL查询的编译时验证
- 提供方便的注解,能最大减少重复和易错的样板代码
- 简化了数据库迁移路径
因此建议使用Room,而不是直接操作SQLite API。
设置
在 build.gradle
中,添加以下依赖:
//Kotlin annotation processing tool plugin
apply plugin: 'kotlin-kapt'
dependencies {
def room_version = "2.4.2"
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"
}
主要组件
Room包含了三个主要的组件:
- 数据库类
androidx.room.Database
: 此对象持有数据库,并为应用持久化数据的底层连接提供主要的入口。 - 数据实体
Entity
: 对应数据库表。 - 数据访问对象
DAO
: 一个接口或抽象类,提供数据库的CRUD
抽象操作方法,编译时Room会自动生成DAO
对应的实现实例。
androidx.room.Database
为app提供了关联数据库的DAO
实例。因此,app可以使用这些DAO
方法从数据库检索数据,以作为关联的数据实体对象的实例。此外,app还可以使用定义的数据实体对关联的表进行插入或更新单行或多行操作。下图展示了Room各组件间的关系:
示例
本部分展示了真实项目开发中的一个缩影。
项目中新建数据库相关的包
dao
:存放数据访问对象database
:存放数据库对象entity
: 存放数据表实体
数据实体类
以下代码通过注解@Entity
提供了一个数据实体LoginUser
,每个LoginUser
实例都代表tbl_login_user
表中的一行数据。
/**
* 登录用户
*/
@Entity(tableName = "tbl_login_user")
data class LoginUser(
@PrimaryKey
@ColumnInfo(name = "user_id")
val userId: String,
//登录名
@ColumnInfo(name = "login_name")
val loginName: String?,
//用于展示的名称
@ColumnInfo(name = "user_name")
val userName: String?