我对使用 @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 { }` .
1条答案
按热度按时间3vpjnl9f1#
Transaction
只能用于Dao
方法