A diferencia de otros SDK de Realm, el SDK de Kotlin no proporciona objetos ni colecciones en vivo que se actualicen simultáneamente con los datos subyacentes. En su lugar, el SDK de Kotlin funciona exclusivamente con objetos congelados que pueden transferirse entre subprocesos de forma segura.
Trabajar con objetos congelados
Debido a que los objetos congelados no se actualizan automáticamente cuando los datos cambian en su reino, funcionan de manera un poco diferente a los objetos activos que pueda haber usado en otros SDK de Realm.
Acceda a una versión en vivo del objeto congelado
Para actualizar o eliminar objetos, estos deben estar activos. Puede convertir un objeto congelado en activo en una transacción con mutableRealm.findLatest(). Los objetos activos solo son accesibles dentro de una transacción de escritura dentro de un cierre de escritura o de bloqueo de escritura.
Los objetos devueltos de un cierre de escritura se convierten en objetos congelados cuando se completa la transacción de escritura.
val sample: Sample? = realm.query<Sample>() .first().find() // delete one object synchronously realm.writeBlocking { if (sample != null) { findLatest(sample) ?.also { delete(it) } } } // delete a query result asynchronously GlobalScope.launch { realm.write { query<Sample>() .first() .find() ?.also { delete(it) } } }
Tip
Puedes comprobar si un objeto está congelado con el método isFrozen().
Reinos seguros para subprocesos
La clase Realm ya no está limitada a subprocesos, por lo que puedes compartir un mismo reino entre varios subprocesos. Ya no es necesario gestionar el ciclo de vida del reino explícitamente con llamadas a Realm.close().
Cambios de acceso
Para acceder a los cambios en los objetos y colecciones, utilice corrutinasy la API de flujo. Los cambios son seguros para subprocesos, por lo que puedes acceder a ellos desde cualquier contexto. Las notificaciones se gestionan en un subproceso de notificación interno dedicado. Los objetos congelados ahora admiten escuchas de cambios.
val config = RealmConfiguration.Builder(schema = setOf(Task::class)) .build() val realm = Realm.open(config) // fetch objects from a realm as Flowables CoroutineScope(Dispatchers.Main).launch { val flow: Flow<ResultsChange<Task>> = realm.query<Task>().asFlow() flow.collect { task -> Log.v("Task: $task") } } // write an object to the realm in a coroutine CoroutineScope(Dispatchers.Main).launch { realm.write { copyToRealm(Task().apply { name = "my task"; status = "Open"}) } }
Importante
La API Flows requiere Kotlinx Coroutines
Para utilizar la API de flujos en su proyecto Kotlin Multiplatform, instale la biblioteca kotlinx.coroutines.
Al igual que en otros SDK de Realm, las transacciones de escritura avanzan implícitamente tu realm a la versión más reciente de los datos almacenados en disco.
Tip
Para obtener más información sobre las notificaciones, consulte Reaccionar a los cambios.
Carga diferida
Los objetos de Realm siguen con carga diferida por defecto. Esto permite consultar grandes colecciones de objetos sin leer grandes cantidades de datos del disco. Esto también significa que el primer acceso a un campo de un objeto siempre devolverá los datos más recientes.