room@transaction无法使用flowable

pu3pd22g  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(442)

我对使用 @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` to方法 `updateMyEntity()` . 这个注解在我的情况下不起作用吗?
我在文件中看到了以下信息,但我不确定这是不是我的情况。
如果查询是异步的(例如返回{@link androidx.lifecycle.livedata livedata}或rxjava{@code flowable}),则在运行查询时而不是在调用方法时正确处理事务。
将此注解放在{@link insert}、{@link update}或{@link delete}方法上没有影响,因为这些方法总是在事务内部运行。类似地,如果一个方法是用{@linkquery}注解的,但是运行insert、update或delete语句,那么它会自动 Package 在事务中,并且这个注解没有任何效果。
如果做了,问题就消失了 `database` 属性和wrap调用 `clear()` 以及 `insertAll()` 与 `database.runInTransaction { }` .

相关问题