Я новичок в базе данных комнат, и недавно я столкнулся с проблемой, связанной с изменением базы данных приложения (обновление/вставка/удаление) без запуска обратного вызова в наблюдателе.
Это класс 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 приведет к срабатыванию наблюдателя. Затем код внутри наблюдателя снова запустится. Это сделает еще одно обновление. Это снова запустит наблюдателя и так далее...
В таком сценарии есть ли способ обновить модель, но пропустить наблюдателей, которые могут прослушивать изменения?
update
в этот момент? То, как написан код в вашем примере, гарантирует, что обновление ничего не изменит в элементе. Вам нужно сделать этот вызов условным, толькоupdate
когда требуется обновление, и в этом случае, когда обновленная версия попадает во второй раз к вашему наблюдателю, он не должен снова вызыватьupdate
. - person zapl   schedule 08.10.2018