一、前言
使用 Room 库存储应用数据时,通过定义数据访问对象(DAOs)与存储的数据进行交互。每一个 DAO 包含用来访问应用数据库的抽象方法,在编译时, Room 会自动生成并实现在 DAO 中定义的访问方法(如果不了解 Room 库,请先阅读:Android Room 库基础入门)。
用数据访问对象(而不是使用查询构建起或者直接查询)访问数据库,可以拆分数据库架构中的不同组件。另外,数据访问对象也使得应用在测试阶段可以轻松模拟试数据库访问。
二、Room 数据访问对象详解
2.1 定义数据访问对象类
数据访问对象类(DAO)可以是接口,也可以是抽象方法(一般情况下,使用接口定义DAO)。定义数据访问对象类时,必须使用 @Dao 注解标示,数据访问对象类(DAO)没有属性,内部定义一个或者多个与应用的数据库进行交互的方法。如下示例所示:
@Dao
interface UserDao {
@Query("SELECT * FROM user")
fun getAll(): List<User>
@Query("SELECT * FROM user WHERE name LIKE :name")
fun findByName(name: String): List<User>
@Insert
fun insertAll(vararg users: User)
@Delete
fun delete(user: User)
注意事项:DAO 类可以是接口,也可以是抽象方法,并且 DAO 类不能有成员属性。
2.2 数据访问对象的方法分类
数据访问对象类中定义的与数据库交互的方法可以分为两种类型:
- 便利类型方法(Convenience methods):便利类型方法可以在不需要编写任何 SQL 语句的情况下,对数据库进行插入、更新和删除行数据。
- 查询类型方法(Query methods):查询类型方法允许开发者编写自定义的 SQL 查询语句与数据库进行交互。
2.2.1 DAO 便利类型方法
Room 提供便利型的注解来定义便利方法,这些方法不需要编写任何的 SQL 语句就可以执行简单的插入、更新和删除行数据,与之对应的注解分别是 @Insert、@Update 和 @Delete。
说明:如果需要定义更复杂的插入、更新和删除,或者需要从数据库中查询数据,请使用 DAO 查询型方法
2.2.1.1 插入
使用 @Insert 注解标注定义的便利方法,可以将方法参数传入的对象数据写入到数据库对应的表中。 传入 @Insert 方法的参数必须是用 @Entity 注解标注的 Room 数据实体类,或者它的集合,当调用 @Insert 方法时,Room 就会将传入的每个数据实体类对象数据插入到对应的表中。如下示例所示:
@Dao
interface UserDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertUser(user: User)
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertAll(vararg users: User)
}
如果 @Insert 方法传入参数是单个数据实体类,调用 @Insert 方法时返回新的行id,如果 @Insert 方法传入的参数是数据实体类集合,调用 @Insert 方法时返回插入的行id数组。
注意事项:
1. 传入@Insert方法的参数必须是用@Entity注解标注的 Room 数据实体类,或者它的集合;
2.@Insert方法可通过onConflict参数指定插入是发生冲突的解决方案(默认值:OnConflictStrategy.ABORT(终止操作,抛出异常))
2.2.1.2 更新
使用 @Update 注解标注定义的便利方法,可以更新数据库表中的指定行的数据。跟 @Insert 类似, 传入 @Update 方法的参数必须是用 @Entity 注解标注的 Room 数据实体类,或者它的集合。如下示例代码所示:
@Dao
interface UserDao {
@Update

本文详细介绍了Android Room库中数据访问对象(DAO)的使用,包括如何定义DAO接口,DAO方法的分类及其作用,如便利方法(插入、更新、删除)和查询方法。此外,还探讨了如何编写异步查询,以避免阻塞UI。通过具体的代码示例,展示了如何使用Kotlin的协程和Flow进行异步数据操作。
最低0.47元/天 解锁文章
1212





