java - Room @Transaction 不适用于 Flowable
问题描述
我在我的数据源方法上使用@Transaction
注释时遇到问题。看起来这个注释在我的情况下不起作用。
我有一个带有 DAO 的常用房间数据库
@Database(entities = [MyEntity::class], version = 1)
abstract class MyDatabase : RoomDatabase() {
abstract fun myDao(): MyDao
}
@Dao
interface myDao {
@Insert
fun insertAll(list: List<MyEntity>)
@Query("SELECT * FROM MyEntity")
fun observe(): Flowable<List<MyEntity>>
@Query("DELETE FROM MyEntity")
fun clear()
}
当我一直这样做时,我的数据源中会出现问题clear()
并且insertAll()
class MyDataSource(database: MyDatabase) {
private val myDao = database.myDao()
@Transaction
fun updateMyEntity(items: List<MyEntity>) {
myDao.clear()
myDao.insertAll(items)
}
fun observeMyEntity(): Flowable<List<MyEntity>> {
return myDao.observe()
}
}
当我打电话时updateMyEntity()
,我在订阅中得到两个结果oberveMyEntity()
。第一个结果是空列表,第二个结果是插入列表。@Transaction
当我向方法添加注释时,我希望只得到插入的列表updateMyEntity()
。这个注释在我的情况下不起作用吗?
我在文档中看到了以下信息,但我不确定是不是我的情况。
如果查询是异步的(例如返回 {@link androidx.lifecycle.LiveData LiveData} 或 RxJava {@code Flowable}),则在运行查询时正确处理事务,而不是在调用方法时。
将此注释放在 {@link Insert}、{@link Update} 或 {@link Delete} 方法上没有影响,因为这些方法总是在事务中运行。同样,如果一个方法使用 {@link Query} 注释但运行了 INSERT、UPDATE 或 DELETE 语句,它会自动包装在事务中,并且此注释无效。
如果创建database
一个属性并包装调用clear()
和insertAll()
with ,问题就会消失database.runInTransaction { }
。
解决方案
Transaction
只能用于Dao
方法
推荐阅读
- c++ - 找到不大于 A 的最大数的最有效方法,该数可被 B 整除
- mysql - 用两个外键加入两次表
- microsoft-graph-api - 按 createdDateTime 过滤安全警报时出现意外结果
- javascript - 我希望能够编辑我的 foreach 中给出的数据
- excel - if语句检查用户是否正在删除单元格
- swift - 如何使用 swift 在数据库中使用嵌套结构映射来自 Firestore 的数据
- android - 屏幕旋转时 NavHostFragment 错误膨胀类片段
- bash - 如何获取通过 ssh 发送到我的主机的远程命令?
- java - 声明 Java 对象但调用子类的构造函数
- javascript - 当我需要不同的操作时,我应该如何让这段代码变干?