Недавно я столкнулся с проблемой, в которой у меня в памяти был список объектов RealResult и показывался в представлении. При щелчке пользователя текущий отображаемый элемент должен быть помечен как удаленный в области (свойство isDeleted
)Android Kotlin Realm Правильный способ запроса + обновление Async
Итак, я просто получил этот объект из ленивого RealmResults
, откройте транзакцию и отметьте ее удаленной. Поскольку RealmResults автоматически обновляется, у меня был слушатель изменений, связанный с notifityDataSetChanged
. Все отлично работает, кроме этого предупреждения:
Mixing asynchronous queries with local writes should be avoided. Realm will convert any async queries to synchronous in order to remain consistent. Use asynchronous writes instead
Что является проблематичным, потому что мой список огромен, и я не хочу, чтобы запрос, чтобы стать sync
. Я решил это так, что я не знаю, что это правильно. Вместо того, чтобы дать объект элемента к функции обновления, я даю идентификатор объекта, а затем сделать это:
Realm.getDefaultInstance().use { realm ->
realm.executeTransactionAsync {
// find the item
realm.where(ItemRealm::class.java)
.equalTo(ItemRealm.ID, itemId).findFirstAsync()
.addChangeListener(object : RealmChangeListener<ItemRealm> {
override fun onChange(element: ItemRealm) {
element.deleted = true
element.removeChangeListener(this)
}
})
}
}
Проблемой, с которой им не уверен, является async
части запроса внутри транзакций асинхронных.
Редактировать. На самом деле, он бросает java.lang.IllegalStateException: Realm access from incorrect thread. Realm objects can only be accessed on the thread they were created.
Edit2: Пробовал это и показать доступ Realm на другом потоке:
fun setItemDeleted(itemId: Long) {
// write so new realm instance
Realm.getDefaultInstance().use { realm ->
realm.executeTransactionAsync {
// find the item
val item = realm.where(ItemRealm::class.java)
.equalTo(ItemRealm.TIMESTAMP, itemId).findFirst()
item?.userDeleted = true
}
}
}
Я в основном удивлен, что это не просто врезаться в целом, говорю, что вы пытаетесь добавить изменения слушателя на не нити петлителя, или что вы обращаетесь объект Realm фонового потока от пользовательского интерфейса нить. – EpicPandaForce
ya. realm edit please –
любая идея, почему нужно давать доступ к различным потокам при редактировании 2? –