首页 > 解决方案 > 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 { }

标签: javaandroidkotlinandroid-roomrx-java2

解决方案


Transaction只能用于Dao方法


推荐阅读