Modo correcto de consulta de Android Kotlin Realm + devolución de elementos no administrados en Bg Thread
¿Cuál es la forma correcta de consultar y devolver un resultado no gestionado de elementos con el reino, todo en el hilo de background ?. Estoy usando algo así:
return Observable.just(1) .subscribeOn(Schedulers.io()) .map { val realm = Realm.getDefaultInstance() val results = realm.where(ItemRealm::class.java) .equalTo("sent", false).findAll() realm to results } .map { val (realm, results) = it val unManagedResults = realm.copyFromRealm(results) realm.close() unManagedResults } }
Y luego encadenando este observable con otro que publicará los resultados en un server.
- El tamaño de RealmResults es cero
- Error de compilation de time al convertir RealmObject Class a Kotlin
- Cómo implementar un reciclador de carga perezosa. Adaptador de vista como el reciclador de reino. Ver el adaptador usando kotlin.
- Error: contiene campo final ilegal -Kotlin
- Reino que devuelve datos obsoletos
La solución funciona, aunque es un poco fea en estos aspectos:
- No hay forma adecuada de envolver el realmQuery en un observable, porque no hay forma de abrir una instancia real en un hilo de background sin este tipo de trampa (al less que yo sepa), así que necesito usar este observable falso.
Observable.just(1)
. -
No es el mejor lugar para abrir y cerrar instancias de Realm, dentro del primer y segundo map
-
No sé si se garantiza que la instancia del reino esté cerrada después de que se hayan copydo todos los elementos.
Entonces, ¿cuál es la forma correcta de consultar y devolver los resultados no administrados en el hilo de background (algo de context, necesito esto para enviar los resultados a un server, en segundo plano y esta tarea es totalmente independiente del flujo de datos actual de mi aplicación, por lo que debería estar fuera del hilo principal).
Versión sugerida:
return Observable.fromCallable { Realm.getDefaultInstance().use { realm -> realm.copyFromRealm( realm.where(ItemRealm::class.java) .equalTo(ItemRealm.FIELD_SEND, false).findAll() ) } }
- Cómo insert el object RealmList con copyToRealm
- Realm & Kotlin: DefaultRealmModuleMediator.java -> error: statement inalcanzable
- Cómo get Flowable <List <Foo >> del object 'Bar' con relaciones de uno a muchos 'Foo' usando el reino y Rxjava
- Agregar valor generado a un RealmObject
- Kotlin y @Transient
- consultas de múltiples dominios de Android con RXJava
- El complemento "kotlin-noarg" no funciona en el Reino
- Parceler: no se puede encontrar el generador de lectura / escritura para el tipo io.realm.RealmList
Así es como convertirías tus objects de Reino no administrados:
return Observable.defer(() -> { try(Realm realm = Realm.getDefaultInstance()) { return Observable.just( realm.copyFromRealm( realm.where(ItemRealm.class).equalTo("sent", false).findAll() ) ); } }).subscribeOn(Schedulers.io());
Aunque esta respuesta es Java, la respuesta de Kotlin está a solo medio paso de distancia.
- La configuration regional de Spring Boot Controller no cambia con el parámetro
- La cookie de session no persiste con JSoup