问题描述
我在数据源方法上使用@Transaction
注释存在问题。在我看来,此注释无法正常工作。
@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插入},{@ link更新}或{@link删除}方法上没有 影响,因为这些方法始终在事务内运行。同样,如果方法是 使用{@link Query}进行注释,但运行INSERT,UPDATE或DELETE语句,该语句将自动包装在事务中,并且此注释无效。
如果将database
设置为属性并用clear()
包装调用insertAll()
和database.runInTransaction { }
,问题就消失了。
解决方法
Transaction
仅可用于Dao
方法