Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /
Sync Device Data

Add Device Sync to an App - Kotlin SDK

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

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.

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.

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.

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:

  1. An Atlas App Services App with authentication enabled. To learn how, refer to Create an App Services App in the App Services documentation.

  2. Confirme que su aplicación pueda conectarse al backend de App Services. Para aprender cómo, consulta Conectarse a Atlas App Services - Kotlin SDK.

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:

Ejemplo de modelo de datos de la aplicación ToDo
class List : RealmObject {
@PrimaryKey
var _id: ObjectId = ObjectId()
var name: String = ""
var ownerId: String = ""
var items: RealmList<Item> = realmListOf()
}
class Item : RealmObject {
@PrimaryKey
var _id: ObjectId = ObjectId()
var name: String = ""
var complete: Boolean = false
}

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.

Después de haber configurado y habilitado la sincronización en Atlas App Services, puede agregar la sincronización a su aplicación cliente.

1

Update your dependencies to include the Sync distribution of the Realm Kotlin SDK.

2

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.

3

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.

4

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 List y Item

  • una suscripción inicial que consulta todos los List objetos que posee el usuario y todos los Item objetos 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.

5

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)

  • ownerId

  • complete

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 List is owned by the user and the Item is 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.

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:

Volver

Sync Device Data