【发布时间】:2018-10-08 12:56:10
【问题描述】:
我是房间数据库的新手,最近我遇到了一个问题,即修改应用程序的数据库(更新/插入/删除)而不导致观察者中的回调被触发。
这是我的模型的 Dao 类:
@Dao
interface ReceiptRowDao {
@Query("SELECT * FROM my_model ")
fun getMyModels(): LiveData<MutableList<MyModel>>
@Update
fun update(receiptRow: ReceiptRow): Int
}
我的Database 班级:
@Database(
entities = [
(MyModel::class)
],
version = 1,
exportSchema = false
)
abstract class AppDatabase: RoomDatabase() {
abstract fun myModelDao(): MyModelDao
}
用法:
class MyClass {
val db: AppDatabase = Room
.databaseBuilder(mContext, AppDatabase::class.java, "my_db")
.allowMainThreadQueries()
.build()
fun test() {
val myLiveData = db.myModelDao.getMyModels()
myLiveData!!.observe(this, Observer { data ->
...
val item = data.get(0)
item.id = 4
// This update should not cause a callback
db.myModelDao().update(item)
...
})
}
}
在MyClass 中,更新指令将导致无限循环,因为对 MyModel 的更新会触发观察者。然后观察者内部的代码将再次运行。这将进行另一次更新。这将再次触发观察者,依此类推......
在这种情况下,有没有办法更新模型,但跳过可能正在监听变化的观察者?
【问题讨论】:
-
我已经在 java 文件中实现了这个。我可以分享java代码吗?
-
@Raza 当然,不客气。
-
当时为什么要
update?在您的示例中编写代码的方式保证了更新不会改变项目的任何内容。您需要将该调用设为有条件的,仅在需要更新时使用update,在这种情况下,更新版本第二次访问您的观察者时,它不应再次调用update。 -
@zapl 应该是更新前修改了一些属性。我认为这很明显,但我要编辑我的问题。谢谢。
-
@DionisBeqiraj 只是想确认您是否在这里使用了两个不同的实体,因为 getMyModels 是 MyModel 并且更新是 ReceiptRow ?那么他们将如何在循环中修复?你运行代码了吗?
标签: android database kotlin android-room android-database