简述
Android Jetpack的出现统一了Android开发生态,各种三方库逐渐被官方组件所取代。Room也同样如此,逐渐取代竞品成为最主流的数据库ORM框架。这当然不仅仅因为其官方身份,更是因为其良好的开发体验,大大降低了SQLite的使用门槛。
Room是Google官方在SQLite基础上封装的一款数据持久库,是Jetpack全家桶的一员,和Jetpack其他库有着可以高度搭配协调的天然优势。Room使用APT技术,大大简化了使用SQLite的代码量,只需使用注解配合少量代码即可实现高效的数据库操作。
Room基本介绍
框架特点
相对于SQLiteOpenHelper等传统方法,使用Room操作SQLite有以下优势:
- 编译期的SQL语法检查
- 开发高效,避免大量模板代码
- API设计友好,容易理解
- 可以与RxJava、 LiveData 、 Kotlin Coroutines等进行桥接
添加依赖
dependencies {
implementation "androidx.room:room-runtime:2.2.5"
kapt "androidx.room:room-compiler:2.2.5"
}
基本组件
Room的使用,主要涉及以下3个组件
- Database: 访问底层数据库的入口
- Entity: 代表数据库中的表(table),一般用注解
- Data Access Object (DAO): 数据库访问者
这三个组件的概念也出现在其他ORM框架中,有过使用经验的同学理解起来并不困难: 通过Database获取DAO,然后通过DAO查询并获取entities,最终通过entities对数据库table中数据进行读写
实例实战
insert:使用注解 @Insert,Room 会自动将所有参数在单个事物中插入数据库
@Insert
public fun inertUser (user: User) // 单个参数可以返回 long
@Insert
public fun insertUserList (array: Array<User>) // 参数为集合可以返回 long []
数据库添加 User
val user = User()
user.name = "赵云 编号 = $number"
val address = Address()
address.street = "成都接头"
address.state = "蜀汉"
address.city = "常山"
address.postCode = 10010
user.address = address
userDao.inertUser (user) // 添加 User
添加数据结果:
upadte:使用 @Update 注解
@Update
public fun update (user: User) // 可以让此方法返回一个 int 值,表示数据库中更新的行数
val user = User()
user.id = 1
user.name = "张翼德"
address.city = "涿郡"
.....
userDao.update(user)
点击 Update 后再查询结果:此时的赵云已经改为张翼徳了
delete:使用 @Delete 注解
@Delete
public fun delete (user: User) // 可以返回一个 int 值,表示从数据库中删除的行数
val user = User()
user.id = 1 // 要删除的主键 id
userDa