Android Kotlin Realm Forma correcta de consultar + Actualizar Async

Recientemente me enfrenté a un problema en el que tenía en la memory una Lista de objects de RealResult y la mostraba en una vista. Al hacer clic en el usuario, el elemento que se muestra actualmente debe marcarse como eliminado en el reino (la propiedad está isDeleted )

Así que estaba obteniendo ese object de la list perezosa de RealmResults , abrí una transacción y la RealmResults eliminada. Como los RealmResults se actualizan automáticamente, tuve un detector de cambios vinculado a un notifityDataSetChanged . Todo funciona bien excepto esta advertencia:

 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 

Lo cual es problemático porque mi list es enorme y no quiero que la consulta se sync . Lo resolví de esta manera, lo cual no sé, es correcto. En lugar de dar el object object a la function de actualización, le doy el id del object y luego hago esto:

 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) } }) } } 

El problema que no estoy seguro es la parte async de la consulta dentro de una transacción asíncrona.

Editar. En realidad, arroja java.lang.IllegalStateException: Realm access from incorrect thread. Realm objects can only be accessed on the thread they were created. java.lang.IllegalStateException: Realm access from incorrect thread. Realm objects can only be accessed on the thread they were created.

Edit2: Intenté esto y le mostré el acceso a Realm en diferentes hilos:

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

Todo en executeTransactionAsync() ejecuta en una executeTransactionAsync() background, por lo que debe usar los methods síncronos para get su object dentro de ella.

 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 } } 
  • Agregar valor generado a un RealmObject
  • Uso perezoso de Kotlin
  • No se puede configurar el Reino en el proyecto usando Kotlin
  • Parceler: no se puede encontrar el generador de lectura / escritura para el tipo io.realm.RealmList
  • Realm & Kotlin: DefaultRealmModuleMediator.java -> error: statement inalcanzable
  • consultas de múltiples dominios de Android con RXJava
  • Cómo consultar Realm en el background Subprocess usando RxJava2
  • Cómo usar Realm en una biblioteca
  • Realm executeTransactionAsync no escribe datos en DB
  • Realm, findAllSorted y distinct
  • Cómo usar Realm's en el método con Kotlin