Esta página contiene información sobre Device Sync, sus conceptos básicos y cómo añadir Sync a una aplicación cliente con el SDK de Kotlin de Realm. Una vez que haya añadido Sync a su aplicación, podrá acceder a un realm sincronizado desde el cliente.
¿Ya conoces la Sincronización de dispositivos? ¡Sigue adelante! Habilite la sincronización del dispositivo en la sección Servicios de aplicaciones para comenzar.
Sincronización de dispositivos
Device Sync sincroniza los datos entre los dispositivos cliente y Atlas. Los datos se conservan en el dispositivo, incluso sin conexión. Cuando el dispositivo tiene conexión de red, Device Sync carga y descarga datos en segundo plano y gestiona la resolución de conflictos.
Los datos que se sincronizan entre tu aplicación cliente y Atlas se determinan por los permisos de un usuario para acceder a datos elegibles. Los datos elegibles son la intersección de:
Modelo de datos: información sobre su tipo de datos
Consultas de suscripción: las condiciones que definen qué datos almacenar
Permisos: los permisos basados en roles necesarios para interactuar con datos que cumplen las condiciones especificadas
Para obtener una explicación detallada de la sincronización de dispositivos, consulte Introducción a la sincronización de dispositivos Atlas en la documentación de Atlas App Services.
Modelo de datos
El modelo de datos de sincronización de dispositivos define los tipos de objetos que se pueden sincronizar. Contiene un esquema del lado del cliente y del lado del servidor:
Esquema de reino: el modelo de objetos en su aplicación cliente que define sus datos en Kotlin.
Esquema de App Services: el esquema de Atlas App Services que define tus datos en BSON.
Ambos esquemas deben ser consistentes entre sí para sincronizar los datos.
Puede definir el modelo de datos de sincronización del dispositivo primero en una aplicación cliente o primero en Atlas:
Para definir el modelo de datos a través de la aplicación cliente, primero se define un modelo de objetos directamente en el código de la aplicación cliente. Después, se puede usar el modo de desarrollo para generar automáticamente un esquema de App Services compatible. El modo de desarrollo es una opción de configuración que permite a Device Sync inferir y actualizar esquemas basados en modelos de datos del cliente al sincronizar datos desde el cliente. La sección "Habilitar Device Sync en App Services" describe cómo habilitar Device Sync con el modo de desarrollo en la aplicación cliente.
Si ya tiene datos en Atlas y prefiere definir primero su modelo de datos a través de Atlas, consulte Sincronizar datos en Atlas con una aplicación cliente en la documentación de App Services.
Nota
Mapeo de modelos de datos en App Services
Para obtener más información sobre cómo se asignan datos entre el cliente y Atlas, consulte Datos de modelo con sincronización de dispositivos - SDK de Kotlin.
Suscripciones
Una suscripción es una consulta del lado del cliente a objetos de tu modelo de datos. App Services solo sincroniza los objetos que coinciden con la consulta. Puedes definir varias consultas en tu aplicación cliente. Debes definir al menos una consulta para cada tipo de objeto de tu modelo de datos.
App Services asegura que las queries del lado del cliente sean consistentes con tu esquema de App Services mediante campos consultables. Estos son los campos de tu modelo de datos que pueden usarse en una query de suscripción. No es posible definir una suscripción usando un campo que no esté en sus campos consultables.
Cuando el modo de desarrollo está habilitado, App Services agrega automáticamente los campos que aparecen en las consultas de tus clientes como campos consultables. También puedes agregar y eliminar manualmente campos consultables a través de la interfaz de usuario de App Services. Para obtener más información, consulta Campos consultables en la documentación de App Services.
Permisos de usuario
App Services utiliza permisos basados en roles para controlar los datos que los usuarios pueden leer y guardar:
Cuando un usuario tiene permisos de lectura, Device Sync descarga los datos que coinciden con la consulta de suscripción al cliente.
Cuando un usuario tiene permisos de escritura, Atlas le permite escribir en los datos sincronizados y cargar datos escritos localmente en el backend.
Puedes definir y administrar roles en la interfaz de usuario de App Services. Al habilitar la sincronización, seleccionas un rol predeterminado, que puedes modificar posteriormente. Para obtener más información, consulta "Permisos basados en roles" en la documentación de App Services.
Requisitos previos
Puedes añadir Device Sync a una aplicación de varias maneras, según el estado de la aplicación y los datos. Esta guía describe cómo añadir Sync a una aplicación cliente existente mediante el modo de desarrollo. Se asume que tu aplicación utiliza el SDK de Kotlin de Realm y que ya has definido un modelo de datos en el código cliente.
Debido a que Device Sync conecta su aplicación cliente al backend de App Services a través de una aplicación Atlas App Services, debe seguir estos pasos antes de poder comenzar:
Una aplicación de Atlas App Services con autenticación habilitada. Para saber cómo hacerlo, consulta "Crear una aplicación de App Services" en la documentación de App Services.
Confirma que tu aplicación pueda conectarse al backend de App Services. Para saber cómo, consulta Conectarse a Atlas App Services - SDK de Kotlin.
Acerca de los ejemplos de esta página
Los ejemplos de esta página se refieren a una aplicación Kotlin Todo de ejemplo con un modelo de datos ya definido que incluye una List objeto que contiene una lista de Item objetos:
class List : RealmObject { var _id: ObjectId = ObjectId() var name: String = "" var ownerId: String = "" var items: RealmList<Item> = realmListOf() } class Item : RealmObject { var _id: ObjectId = ObjectId() var name: String = "" var complete: Boolean = false }
Habilitar la sincronización de dispositivos en los servicios de aplicaciones
Primero debe habilitar la sincronización de dispositivos en su aplicación Atlas App Services antes de poder agregar la sincronización a su aplicación cliente.
Para habilitar la sincronización de dispositivos en su aplicación, complete los pasos descritos en el procedimiento Configurar y habilitar la sincronización de dispositivos Atlas en la documentación de Servicios de la aplicación.
Durante este proceso, puede elegir si desea habilitar el modo de desarrollo y seleccionar un rol predeterminado para los usuarios de su aplicación. Para obtener más información sobre las opciones de configuración disponibles, consulte "Configuración de sincronización" en la documentación de App Services.
Tip
Recomendamos habilitar el modo de desarrollo al habilitar la sincronización por primera vez y deshabilitarlo antes de que la aplicación entre en producción. Para obtener más información, consulte "Modo de desarrollo" en la documentación de App Services.
Para nuestra aplicación de ejemplo, habilitamos la Sincronización de Dispositivos con el Modo de Desarrollo y, a continuación, añadimos el rol predeterminado "El usuario puede leer y escribir todos los datos". Esto significa que, para un usuario autorizado con conexión de red, la Sincronización de Dispositivos descarga los datos válidos al cliente y Atlas permite las escrituras en el cliente y, a continuación, las sincroniza con el backend. Para obtener más información sobre qué sucede cuando un usuario autorizado no tiene conexión de red, consulte Compensación de Escrituras.
Agregar sincronización a su aplicación cliente
Después de haber configurado y habilitado la sincronización en Atlas App Services, puede agregar la sincronización a su aplicación cliente.
Instale la distribución sincronizar del Kotlin SDK
Actualice sus dependencias para incluir la distribución Sync del SDK Realm Kotlin.
Conectarse al backend de App Services
Pase su ID de aplicación a un App cliente para inicializar la aplicación. Para obtener su ID de aplicación desde la interfaz de usuario de App Services, consulte "Encuentre su ID de aplicación" en la documentación de App Services.
Para nuestra aplicación de ejemplo, pasamos nuestro ID de aplicación para inicializar un App con valores de configuración predeterminados:
// Replace `YOUR_APP_ID` with your Atlas App ID val app = App.create(YOUR_APP_ID)
Para obtener más información sobre cómo acceder y configurar el cliente de la aplicación, consulte Inicializar el cliente de la aplicación.
Autenticar un usuario
Autentica un usuario en tu aplicación cliente utilizando un proveedor de autenticación que hayas habilitado.
Para nuestra aplicación de ejemplo, iniciamos sesión como usuario mediante autenticación anónima:
// Authenticate the Atlas App Services user val myAuthenticatedUser = app.login(Credentials.anonymous())
Para obtener más información sobre cómo autenticar usuarios en su aplicación, consulte Crear y autenticar usuarios - SDK de Kotlin.
Definir la configuración de sincronización
La sincronización de dispositivos requiere un objeto SyncConfiguration para abrir un dominio sincronizado. Tenga en cuenta que esto es diferente del RealmConfiguration objeto utilizado para abrir un dominio no sincronizado.
El objeto SyncConfiguration requiere lo siguiente:
Usuario: el objeto de usuario autenticado.
Esquema: todos los tipos de objetos que desea incluir en este reino.
Suscripción inicial: la consulta de suscripción que especifica los datos que se sincronizarán al abrir el dominio sincronizado. Puede actualizar sus suscripciones una vez abierto el dominio. Consulte "Administrar suscripciones de sincronización - SDK de Kotlin" para obtener más información.
Para conocer parámetros de configuración adicionales, consulte Configurar y abrir un reino sincronizado - Kotlin SDK.
Para nuestra aplicación de ejemplo, definimos una configuración con:
un esquema que incluye nuestros objetos
ListyItemuna suscripción inicial que consulta todos los
Listobjetos que posee el usuario y todos losItemobjetos incompletos
// Define the configuration for the synced realm val config = // Pass the authenticated user and the set of // all objects types you want to be able to sync SyncConfiguration.Builder( user = myAuthenticatedUser, schema = setOf(List::class, Item::class) ) // Define an initial subscription with queries that include // the user's lists with incomplete items .initialSubscriptions{ realm -> add(realm.query<List>("ownerId == $0", myAuthenticatedUser.id), name = "user-lists" ) add(realm.query<Item>("complete = false"), name = "incomplete-items" ) } .build()
Importante
Tipos de objetos en su esquema
El esquema de configuración de sincronización debe incluir todos los tipos de objeto con los que desea trabajar en el dominio sincronizado. Si intenta referenciar o escribir un objeto de un tipo que no está en su esquema, el dominio devuelve un error de validación del esquema.
Abrir el reino sincronizado
Utilice la configuración definida para abrir el dominio sincronizado. Una vez abierto correctamente, la consulta de suscripción inicial determina qué datos sincronizar con el cliente. Si el modo de desarrollo está habilitado, App Services agrega automáticamente los campos consultables según la consulta definida en el esquema.
Para nuestra aplicación de ejemplo, pasamos nuestro objeto config a realm.open() para abrir un reino sincronizado y luego esperamos que nuestras suscripciones se sincronicen con el backend:
// Open the synced realm with the defined configuration val realm = Realm.open(config) Log.v("Successfully opened synced realm: ${realm.configuration.name}") // Wait for initial subscriptions to sync to Atlas realm.subscriptions.waitForSynchronization()
Debido a que tenemos habilitado el modo de desarrollo, App Services agregó automáticamente los siguientes campos como campos consultables en función de nuestra suscripción inicial:
_id(siempre incluido)ownerIdcomplete
Utilice el reino
Ahora que has abierto el realm configurado y sincronizado, puedes trabajar con sus datos en el realm. Mientras trabajas con datos locales, un hilo en segundo plano integra de forma eficiente, sube y descarga conjuntos de cambios.
La sintaxis para leer, guardar y ver los cambios es idéntica a la sintaxis de los realms no sincronizados. Sin embargo, hay consideraciones adicionales al escribir datos en un realm sincronizado. Para obtener más información, consulta Escribir datos en un Synced Realm: Kotlin SDK.
Para nuestra aplicación de ejemplo, escribimos un nuevo objeto List y Item, luego los copiamos al reino sincronizado:
// Write List and Item objects to the synced realm // Objects that match the subscription query are synced to Atlas realm.write { val list = List().apply { name = "My Todo List" ownerId = myAuthenticatedUser.id items.add(Item().apply { name = "Check email" complete = false }) } copyToRealm(list) } realm.syncSession.uploadAllLocalChanges(30.seconds)
Los objetos se escriben correctamente en el dispositivo y luego se sincronizan con Atlas porque:
Ambos objetos están dentro de los parámetros de la consulta de suscripción (el
Listes propiedad del usuario y elItemestá incompleto).El usuario actual tiene permiso para escribir datos en el backend (el rol permite a los usuarios autorizados leer y escribir todos los datos).
Si nuestra operación de escritura no coincide con la consulta o el usuario actual no tiene los permisos necesarios, entonces Realm revierte la escritura con una operación de error no fatal llamada escritura compensatoria.
Próximos pasos
Una vez que su aplicación esté sincronizando exitosamente los datos deseados con Atlas, puede obtener más información sobre cómo usar Sync con el SDK de Kotlin:
Configurar y abrir un reino sincronizado - SDK de Kotlin: obtenga información sobre las opciones de configuración del cliente de aplicación disponibles, como establecer un nombre de aplicación de depuración, proporcionar encabezados de solicitud personalizados o especificar un despachador.
Administrar suscripciones de sincronización - SDK de Kotlin: aprenda a definir y administrar las consultas de suscripción en su aplicación.
Escribir datos en un reino sincronizado - SDK de Kotlin: obtenga más información sobre cómo escribir en un reino sincronizado, cómo manejar errores de escritura compensatorios y cómo agrupar escrituras para mejorar el rendimiento.
Gestione una sesión de sincronización - Kotlin SDK: Aprende a gestionar la comunicación con App Services a través de sesiones de sincronización.
Manejar errores de sincronización - SDK de Kotlin: aprenda a manejar errores de sincronización que pueden ocurrir, incluidos los reinicios del cliente.