Esta página contiene información para usar Realm rápidamente con el SDK de Kotlin. El opcional La secciónAgregar sincronización de dispositivos ilustra cómo integrar Atlas Device Sync en su aplicación.
Antes de comenzar, asegúrese de haber instalado el SDK de Kotlin para su plataforma.
Nota
Cómo usar este inicio rápido con KMP
Si está ejecutando este proyecto en un nuevo proyecto de plantilla Kotlin Multiplatform (KMP), puede copiar y pegar los siguientes fragmentos en el método Greeting.greeting() del módulo commonMain.
Define tu modelo de objeto
El modelo de datos de su aplicación define la estructura de los datos almacenados en Realm. Puede definirlo mediante clases Kotlin en el código de su aplicación con los Modelos de Objetos de Realm.
Para definir el modelo de datos de su aplicación, agregue una definición de clase al código de la misma. El siguiente ejemplo ilustra la creación de un modelo "Elemento" que representa los elementos de la lista de tareas pendientes en una aplicación de lista de tareas pendientes.
class Item() : RealmObject { var _id: ObjectId = ObjectId() var isComplete: Boolean = false var summary: String = "" var owner_id: String = "" constructor(ownerId: String = "") : this() { owner_id = ownerId } }
Abrir un reino
Usa RealmConfiguration.create() para abrir un reino con los parámetros predeterminados. Pasa tu configuración al constructor de la fábrica de reinos para generar una instancia de ese reino:
val config = RealmConfiguration.create(schema = setOf(Item::class)) val realm: Realm = Realm.open(config)
Para obtener más información sobre cómo controlar los detalles de la RealmConfiguration que desea abrir (por ejemplo, nombre, ubicación, versión del esquema), consulte Abrir y cerrar un Realm.
Crear, leer, actualizar y eliminar objetos
Una vez abierto, puede crear objetos dentro de un reino en un bloque de transacción de escritura.
Para crear un nuevo Item, cree una instancia de la clase Item y agréguela al reino en un bloque de transacción de escritura:
realm.writeBlocking { copyToRealm(Item().apply { summary = "Do the laundry" isComplete = false }) }
Puede recuperar una colección de todos los elementos de Todo en el reino con query.find():
// all items in the realm val items: RealmResults<Item> = realm.query<Item>().find()
También puede filtrar una colección para recuperar una colección de objetos más específica:
// items in the realm whose name begins with the letter 'D' val itemsThatBeginWIthD: RealmResults<Item> = realm.query<Item>("summary BEGINSWITH $0", "D") .find() // todo items that have not been completed yet val incompleteItems: RealmResults<Item> = realm.query<Item>("isComplete == false") .find()
Encuentre más información sobre las consultas de cadenas Realm en Filtrar datos.
Para modificar un elemento de Todo, actualice sus propiedades en un bloque de transacción de escritura:
// change the first item with open status to complete to show that the todo item has been done realm.writeBlocking { findLatest(incompleteItems[0])?.isComplete = true }
Finalmente, puedes eliminar un elemento Todo llamando a mutableRealm.delete() en un bloque de transacción de escritura:
// delete the first item in the realm realm.writeBlocking { val writeTransactionItems = query<Item>().find() delete(writeTransactionItems.first()) }
Esté atento a los cambios
Puedes observar un reino, una colección o un objeto para detectar cambios con el observe .
Importante
Limitaciones de la tecnología sin servidor
No puedes observar cambios si la fuente de datos es una instancia sin servidor de Atlas. El servidor sin servidor de MongoDB actualmente no admite flujos de cambios, que se emplean en las colecciones monitoreadas para escuchar cambios.
En el siguiente ejemplo, escuchamos cambios en todos los objetos Item.
// flow.collect() is blocking -- run it in a background context val job = CoroutineScope(Dispatchers.Default).launch { // create a Flow from the Item collection, then add a listener to the Flow val itemsFlow = items.asFlow() itemsFlow.collect { changes: ResultsChange<Item> -> when (changes) { // UpdatedResults means this change represents an update/insert/delete operation is UpdatedResults -> { changes.insertions // indexes of inserted objects changes.insertionRanges // ranges of inserted objects changes.changes // indexes of modified objects changes.changeRanges // ranges of modified objects changes.deletions // indexes of deleted objects changes.deletionRanges // ranges of deleted objects changes.list // the full collection of objects } else -> { // types other than UpdatedResults are not changes -- ignore them } } } }
Más tarde, cuando haya terminado de observar, cancele el trabajo para cancelar la corrutina:
job.cancel() // cancel the coroutine containing the listener
Cerrar un reino
Para cerrar un dominio y todos los recursos subyacentes, llame a realm.close().El close() método se bloquea hasta que se completen todas las transacciones de escritura en el dominio.
realm.close()
Agregar sincronización de dispositivos (opcional)
Esta sección ilustra cómo autenticarse con un usuario anónimo y abrir un reino de sincronización flexible para comenzar a sincronizar datos entre dispositivos.
Requisitos previos
Los fragmentos de código de esta sección requieren lo siguiente:
Se habilitó la autenticación anónima en la interfaz de usuario de App Services
Habilite la sincronización flexible con el modo de desarrollo activado y un
owner_idcampo en el Queryable Fields sección
Inicializar la aplicación
Para usar las funciones de App Services, como la autenticación y la sincronización, accede a tu aplicación de App Services con tu ID de aplicación. Puedes encontrarlo en la interfaz de App Services.
val app = App.create(YOUR_APP_ID)
Autenticar un usuario
Para autenticar e iniciar sesión, llame a App.login. Cuando la autenticación anónima está habilitada, los usuarios pueden iniciar sesión inmediatamente en su aplicación sin proporcionar información de identificación.
val credentials = Credentials.anonymous() val user = app.login(credentials)
Abrir un reino sincronizado
Una vez que haya inicializado su aplicación Atlas App Services, haya autenticado un usuario y haya definido su modelo de objetos, puede crear una SyncConfiguration.
Si ha abierto un reino local siguiendo la sección Abrir un reino anterior, reemplace RealmConfiguration con el que se SyncConfiguration describe a continuación.
Pase el usuario autenticado y la Item clase a la función SyncConfiguration.Builder para crear una configuración de sincronización flexible.
Importante
Suscripciones iniciales
Necesita al menos una suscripción para poder leer o escribir en el dominio. Use initialSubscriptions para definir la suscripción inicial establecida al abrir el archivo del dominio por primera vez. Pase la consulta a la que desea suscribirse y un nombre para la suscripción a la función add().
El siguiente ejemplo especifica una suscripción denominada "Elementos del usuario" con todos los objetos Item.
// create a SyncConfiguration val config = SyncConfiguration.Builder( user, setOf(Item::class) ) // the SyncConfiguration defaults to Flexible Sync, if a Partition is not specified .initialSubscriptions { realm -> add( realm.query<Item>( "owner_id == $0", // owner_id == the logged in user user.id ), "User's Items" ) } .build() val realm = Realm.open(config)
Siguiente: Consulta las aplicaciones de plantilla y el tutorial
Consulta la aplicación de plantilla para experimentar con otra forma rápida de empezar a programar con el SDK de Kotlin de Realm. La plantilla del SDK de Kotlin, etiquetada android.kotlin.todo.flex como, es una aplicación prediseñada que integra Realm y Atlas Device Sync en una aplicación Android personalizable.
Alternativamente, si está interesado en una experiencia guiada, puede leer nuestro tutorial de Android con Kotlin SDK que amplía la aplicación de plantilla.