Docs Menu
Docs Home
/ /
Realm

Arquitectura congelada - SDK de Kotlin

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.

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.

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().

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().

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.

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.

Volver

Realm