joh*_*crq 3 android realm kotlin
我最近遇到一个问题,我在内存中有一个对象的 RealResult 列表,并在视图中显示它。isDeleted用户单击后,当前显示的项目应在领域(属性)中标记为已删除
所以我只是从惰性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
Run Code Online (Sandbox Code Playgroud)
这是有问题的,因为我的列表很大,而且我不希望查询变成sync. 我是这样解决的,不知道这样对不对。我没有将项目对象提供给更新函数,而是提供了对象的 id,然后执行以下操作:
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)
}
})
}
}
Run Code Online (Sandbox Code Playgroud)
我不确定的问题是async异步事务内的查询部分。
编辑。实际上,它抛出java.lang.IllegalStateException: Realm access from incorrect thread. Realm objects can only be accessed on the thread they were created.
Edit2:尝试了这个并在不同的线程上显示领域访问:
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
一切都executeTransactionAsync()在后台线程上运行,因此您应该使用同步方法来获取其中的对象。
Realm.getDefaultInstance().use { realm ->
realm.executeTransactionAsync { bgRealm ->
// find the item
val item = bgRealm.where(ItemRealm::class.java)
.equalTo(ItemRealm.ID, itemId).findFirst()
item?.deleted = true
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3858 次 |
| 最近记录: |