This page contains information about Device Sync, its basic concepts, and how to add Sync to a client app with the Realm Kotlin SDK. Once you have added Sync to your app, you can access a synced realm from the client.
¿Ya conoces la Sincronización de dispositivos? ¡Sigue adelante! Habilite la sincronización del dispositivo en la sección Servicios de aplicaciones para comenzar.
Device Sync
Device Sync sincroniza los datos entre los dispositivos del cliente y Atlas. Los datos se conservan en un dispositivo, incluso cuando están fuera de línea. Cuando el dispositivo tiene una conexión a la red, Device Sync sube 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 los datos que cumplen con 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:
Realm schema: the object model in your client app that defines your data in 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 tu modelo de datos a través de tu aplicación cliente, primero debes definir un modelo de objeto directamente en el código de tu aplicación cliente. Luego, puedes usar el modo de desarrollo para generar automáticamente un esquema de App Services que coincida. El modo de desarrollo es una configuración que permite a Device Sync deducir y actualizar esquemas basados en modelos de datos del cliente cuando sincronices 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 tu aplicación cliente.
If you already have data in Atlas and would prefer to define your data model through Atlas first, refer to Sync Data in Atlas with a Client Application in the App Services documentation.
Nota
Mapeo del modelo de datos en App Services
To learn more about how data maps between the client and Atlas, refer to Model Data with Device Sync - Kotlin SDK.
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.
When Development Mode is enabled, App Services automatically adds the fields that appear in your client queries as queryable fields. You can also manually add and remove queryable fields through the App Services UI. For more information, refer to Queryable Fields in the App Services documentation.
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 agregar Device Sync a una aplicación de varias maneras, dependiendo del estado de tu aplicación y tus datos. Esta guía describe cómo agregar la sincronización a una aplicación cliente existente utilizando el modo de desarrollo. Esta guía asume que tu aplicación usa el SDK Realm Kotlin y que ya has definido un modelo de datos en tu código cliente.
Because Device Sync connects your client app to the App Services backend through an Atlas App Services App, you need to following before you can get started:
An Atlas App Services App with authentication enabled. To learn how, refer to Create an App Services App in the App Services documentation.
Confirme que su aplicación pueda conectarse al backend de App Services. Para aprender cómo, consulta Conectarse a Atlas App Services - Kotlin SDK.
Acerca de los ejemplos en 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
You must first enable Device Sync in your Atlas App Services App before you can add Sync to your client app.
To enable Device Sync in your App, complete the steps outlined in Configure and Enable Atlas Device Sync procedure in the App Services documentation.
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 cuando habilites la sincronización por primera vez, y luego deshabilitarlo antes de que tu aplicación se publique en producción. Para más información, consulta 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 tu 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
Update your dependencies to include the Sync distribution of the Realm Kotlin SDK.
Connect to the App Services backend
Pasa tu ID de la aplicación a un cliente App para inicializar la aplicación. Para obtener tu ID de la aplicación desde la Interfaz de usuario Realm, consulta Encontrar tu ID de la 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.
Authenticate a User
Authenticate a user in your client app using an authentication provider that you have enabled.
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 más información sobre la autenticación de usuarios en tu aplicación, consulta Crear y autenticar usuarios - Kotlin SDK.
Definir la configuración de sincronización
Device Sync requires a SyncConfiguration object to open a synced realm. Note that this is different than the RealmConfiguration object used to open a non-synced realm.
El objeto SyncConfiguration requiere lo siguiente:
Usuario: el objeto de usuario autenticado.
Esquema: todos los tipos de objetos que desees incluir en este realm.
Initial Subscription: the subscription query that specifies the data to sync when the synced realm is initially opened. You can update your subscriptions after the realm is opened. Refer to Manage Sync Subscriptions - Kotlin SDK for more information.
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
The Sync configuration schema must include all object types that you want to work with in your synced realm. If you try to reference or write an object of an object type that isn't in your schema, Realm returns a schema validation error.
Open the Synced Realm
Use the defined configuration to open the synced realm. When the realm is opened successfully, the initial subscription query determines which data to sync to the client. If Development Mode is enabled, App Services automatically adds any queryable fields based on the query defined in your schema.
Para nuestra aplicación de ejemplo, pasamos nuestro objeto config a realm.open() para abrir un realm sincronizado, y luego esperamos a 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()
Because we have Development Mode enabled, App Services automatically added the following as queryable fields based on our initial subscription:
_id(siempre incluido)ownerIdcomplete
Use the Realm
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:
Both objects are within the parameters of the subscription query (the
Listis owned by the user and theItemis incomplete).El usuario actual tiene permiso para guardar datos en el backend (el rol permite a los usuarios autorizados leer y guardar 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.
Write Data to a Synced Realm - Kotlin SDK: Learn more about how to write to a synced realm, how to handle compensating write errors, and how to group writes for improved performance.
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.