Jetpack Room入门系列:(一)基本介绍
Jetpack Room入门系列:(二)使用DAO读写数据库
Jetpack Room入门系列:(三)实体/数据表关系
Jetpack Room入门系列:(四)内部实现原理
Jetpack Room入门系列:(五)数据库版本升级、数据迁移
Jetpack Room入门系列:(六)配合LiveData等三方库的使用
Room中使用Data Access Objects( DAO)对数据库进行读写,相对于SQL语句直接查询,DAO可以定义更加友好的API。DAO中可以自定义CURD方法,还可以方便地与RxJava
、LiveData
等进行集成。
我们可以使用接口或者抽象类定一个DAO,如果使用抽象类,可以选择性的为其定义构造函数,并接受Database作为唯一参数。
Room在编译期会基于定义的DAO生成具体实现类,实现具体CURD方法。
@Insert 插入
@Insert
注解插入操作,编译期生成的代码会将所有的参数以单独的事务更新到DB。
@Dao
interface UserDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertUsers(vararg users: User)
@Insert fun insertBothUsers(user1: User, user2: User)
@Insert fun insertUsersAndFriends(user: User, friends: List<User>)
}
onConflict
设置当事务中遇到冲突时的策略
- OnConflictStrategy.REPLACE : 替换旧值,继续当前事务
- OnConflictStrategy.ROLLBACK : 回滚当前事务
- OnConflictStrategy.ABORT : 结束当前事务、回滚
- OnConflictStrategy.FAIL : 当前事务失败、回滚
- OnConflictStrategy.NONE : 忽略冲突,继续当前事务
最新代码中ROLLBACK 和 FAIL 已经deprecated了,使用ABORT替代
@Update 更新
@Update注解定义更新操作,根据参数对象的主键更新指定row的数据
@Dao
interface UserDao {
@Update(onConflict = OnConflictStrategy.REPLACE)
fun updateUsers(vararg users: User)
@Update fun update(user: User)
}
@Delete 删除
@Delete定义删除操作,根据主键删除指定row
@Dao
interface UserDao {
@Delete
fun deleteUsers(vararg users: User)
}
@Query 查询
@Query
注解定义查询操作。@Query中的SQL语句以及返回值类型等会在编译期进行检查,更早的暴露问题
@Dao
interface UserDao {
@Query("SELECT * FROM users")
fun loadAllUsers(): Array<User>
}
指定参数
可以用参数指定@Query中的where条件:
@Dao
interface UserDao {
@Query("SELECT * FROM users WHERE age BETWEEN :minAge AND :maxAge")
fun loadAllUsersBetweenAges(minAge: Int, maxAge: Int): Array<User>
@Query("SELECT * FROM users WHERE first_name LIKE :search " +
"OR last_name LIKE :search")
fun findUserWithName(search: String): List<User>
}
返回子集
返回的结果可以是所有column的子集:
data class NameTuple(
@ColumnInfo(name = "first_name") val firstName: String?,
@ColumnInfo(name = "last_name") val lastName: String?
)@Dao
interface UserDao {
@Query("SELECT first_name, last_name FROM users")
fun loadFullName(): List<NameTuple>
}
返回Cursor
返回Cursor,可以基于Cursor进行进一步操作
@Dao
interface UserDao {
@Query("SELECT * FROM users")
fun loadAllUsers(): Cursor
}
多表查询
@Dao
interface BookDao {
@Query(
"SELECT * FROM book " +
"INNER JOIN loan ON loan.book_id = book.id " +
"INNER JOIN user ON user.id = loan.user_id " +
"WHERE users.name LIKE :userName"
)
fun findBooksBorrowedByNameSync(userName: String): List<Book>
}
SQL可以写任何语句,包括多表连接等
返回类型
Room可以返回Coroutine、RxJava等多个常用库的类型结果,便于在异步、响应式开发中使用