Android Kotlin Realm正确查询和更新异步的方法

时间:2016-08-16 14:25:37

标签: android realm kotlin

我最近遇到了一个问题,我在内存中有一个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.

1 个答案:

答案 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
    }
}