我最近遇到了一个问题,我在内存中有一个RealResult对象列表,并在视图中显示它。用户单击后,当前显示项应在领域(属性ModelBuilder.Entity<Solution>().HasMany(s => s.Projects).WithMany(p => p.Solutions);
)
所以我只是从懒惰的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
。我这样解决了,我不知道它是对的。我给出了对象的id,而不是将item对象赋给更新函数,然后执行以下操作:
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
Edit2:试过这个并在不同的线程上显示Realm访问权限:
java.lang.IllegalStateException: Realm access from incorrect thread. Realm objects can only be accessed on the thread they were created.
答案 0 :(得分:1)
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
}
}