Jetpack Room入门系列:(二)使用DAO读写数据库

在这里插入图片描述
Jetpack Room入门系列:(一)基本介绍
Jetpack Room入门系列:(二)使用DAO读写数据库
Jetpack Room入门系列:(三)实体/数据表关系
Jetpack Room入门系列:(四)内部实现原理
Jetpack Room入门系列:(五)数据库版本升级、数据迁移
Jetpack Room入门系列:(六)配合LiveData等三方库的使用


Room中使用Data Access Objects( DAO)对数据库进行读写,相对于SQL语句直接查询,DAO可以定义更加友好的API。DAO中可以自定义CURD方法,还可以方便地与RxJavaLiveData等进行集成。

我们可以使用接口或者抽象类定一个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条件:

扫描二维码关注公众号,回复: 12648768 查看本文章
@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等多个常用库的类型结果,便于在异步、响应式开发中使用
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/vitaviva/article/details/112721321