room@transaction无法使用flowable

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

我对使用 @Transaction 我的数据源方法的注解。看起来这个注解在我的情况下不起作用。
我和dao有一个普通的房间数据库

  1. @Database(entities = [MyEntity::class], version = 1)
  2. abstract class MyDatabase : RoomDatabase() {
  3. abstract fun myDao(): MyDao
  4. }
  5. @Dao
  6. interface myDao {
  7. @Insert
  8. fun insertAll(list: List<MyEntity>)
  9. @Query("SELECT * FROM MyEntity")
  10. fun observe(): Flowable<List<MyEntity>>
  11. @Query("DELETE FROM MyEntity")
  12. fun clear()
  13. }

问题出现在我的数据源时,我一直这样做 clear() 以及 insertAll() ```
class MyDataSource(database: MyDatabase) {
private val myDao = database.myDao()

  1. @Transaction
  2. fun updateMyEntity(items: List<MyEntity>) {
  3. myDao.clear()
  4. myDao.insertAll(items)
  5. }
  6. fun observeMyEntity(): Flowable<List<MyEntity>> {
  7. return myDao.observe()
  8. }

}

  1. 当我打电话的时候 `updateMyEntity()` ,我在订阅中得到两个结果 `oberveMyEntity()` . 第一个结果是空列表,第二个结果是插入列表。我希望在添加注解时只得到插入的列表 `@Transaction` to方法 `updateMyEntity()` . 这个注解在我的情况下不起作用吗?
  2. 我在文件中看到了以下信息,但我不确定这是不是我的情况。
  3. 如果查询是异步的(例如返回{@link androidx.lifecycle.livedata livedata}或rxjava{@code flowable}),则在运行查询时而不是在调用方法时正确处理事务。
  4. 将此注解放在{@link insert}、{@link update}或{@link delete}方法上没有影响,因为这些方法总是在事务内部运行。类似地,如果一个方法是用{@linkquery}注解的,但是运行insertupdatedelete语句,那么它会自动 Package 在事务中,并且这个注解没有任何效果。
  5. 如果做了,问题就消失了 `database` 属性和wrap调用 `clear()` 以及 `insertAll()` `database.runInTransaction { }` .
3vpjnl9f

3vpjnl9f1#

Transaction 只能用于 Dao 方法

相关问题