Docs Menu
Docs Home
/ /
Sincronizar datos del dispositivo

Configurar y abrir un dominio sincronizado - SDK de Kotlin

Esta página describe cómo abrir una base de datos sincronizada y las distintas opciones de configuración disponibles.

Antes de poder acceder a un reino sincronizado desde el cliente, debe:

  1. Habilitar la sincronización en la interfaz de usuario de App Services.

  2. Instale la distribución de sincronización del SDK de Kotlin para Android o Kotlin Multiplatform.

  3. Autenticar un usuario en su proyecto cliente.

Para abrir un dominio de sincronización flexible, pase un usuario y un conjunto de esquemas de objetos de dominio a SyncConfiguration.Builder(). A continuación, cree un conjunto de suscripciones iniciales con el initialSubscriptions() Método constructor. Finalmente, pasa la configuración a Realm.open() para abrir una instancia del reino:

val app = App.create(YOUR_APP_ID)
// use constants for query names so you can edit or remove them later
val NAME_QUERY = "NAME_QUERY"
runBlocking {
val user = app.login(Credentials.anonymous())
val config = SyncConfiguration.Builder(user, setOf(Toad::class))
.initialSubscriptions { realm ->
add(
realm.query<Toad>(
"name == $0",
"name value"
),
"subscription name"
)
}
.build()
val realm = Realm.open(config)
Log.v("Successfully opened realm: ${realm.configuration.name}")
realm.close()
}

Para obtener más información sobre cómo iniciar el reino con suscripciones iniciales y administrar las suscripciones de reino sincronizadas, consulte Administrar suscripciones de sincronización.

Para ajustar configuraciones específicas, utilice las opciones proporcionadas por SyncConfiguration.Builder:

val app = App.create(YOUR_APP_ID)
runBlocking {
val user = app.login(Credentials.anonymous())
val config = SyncConfiguration.Builder(user, setOf(Toad::class))
.maxNumberOfActiveVersions(10)
.name("realm name")
.initialSubscriptions { realm ->
add(
realm.query<Toad>(
"name == $0",
"name value"
),
"subscription name"
)
}
.build()
val realm = Realm.open(config)
Log.v("Successfully opened realm: ${realm.configuration}")
realm.close()
}

Novedad en la versión 1.13.0: Opciones de configuración de tiempo de espera de sincronización añadidas

En Kotlin v,1.13.0 puedes anular varios tiempos de espera predeterminados para las operaciones de sincronización. Puedes configurar estos tiempos de espera en la App configuración del cliente y se aplican a todas las sesiones de sincronización de la aplicación. Para saber cómo, consulta Configurar tiempos de espera de sincronización.

Cuando abres un realm sincronizado con el Kotlin SDK, puedes usar la función .waitForInitialRemoteData() para descargar el conjunto de cambios desde tu aplicación antes de abrir el realm. Establecer esto bloquea la apertura del realm hasta que se hayan descargado todos los datos. Si un dispositivo está fuera de línea, esto bloquea la apertura del realm. Debido a que la descarga inicial de datos podría ser una operación prolongada, se debe abrir un realm usando este ajuste en un hilo en segundo plano.

Esta función acepta una duración de tiempo de espera Cuando la descarga excede un tiempo de espera determinado, Realm lanza una excepción DownloadingRealmTimeoutException.

val user = app.login(Credentials.emailPassword(email, password))
val config = SyncConfiguration.Builder(user, setOf(Toad::class))
.waitForInitialRemoteData(60.seconds)
.initialSubscriptions { realm ->
add(
realm.query<Toad>(
"name == $0",
"Jeremiah"
),
"toads_named_jeremiah"
)
}
.build()
val realm = Realm.open(config)
Log.v("Successfully opened realm: ${realm.configuration}")
// Query the realm we opened after waiting for data to download, and see that it contains data
val downloadedToads: RealmResults<Toad> = realm.query<Toad>().find()
Log.v("After downloading initial data, downloadedToads.size is ${downloadedToads.size}")
realm.close()

Si existe una condición que determina si tu aplicación debe descargar los datos del servidor antes de abrir el dominio, puedes usarla con SyncSession.downloadAllServerChanges() para descargar los cambios condicionalmente antes de abrir el dominio. Llamar a este método se bloquea hasta que todos los cambios remotos conocidos se hayan descargado y aplicado al dominio, o hasta que se alcance un tiempo de espera especificado. Debes llamar a este método solo desde un subproceso que no sea de interfaz de usuario.

Esta función acepta una duración de tiempo de espera.

val user = app.login(Credentials.emailPassword(email, password))
val config = SyncConfiguration.Builder(user, setOf(Toad::class))
.initialSubscriptions { realm ->
add(
realm.query<Toad>(
"name == $0",
"Lollihops"
),
"toads_named_lollihops"
)
}
.build()
val realm = Realm.open(config)
// Conditionally download data before using the realm based on some business logic
if (downloadData) {
realm.syncSession.downloadAllServerChanges(30.seconds)
}
// Query the realm we opened after waiting for data to download, and see that it contains data
val downloadedToads: RealmResults<Toad> = realm.query<Toad>().find()
Log.v("After conditionally downloading data, downloadedToads.size is ${downloadedToads.size}")
realm.close()

Cuando tu aplicación Realm autentica a un usuario, almacena en caché las credenciales del usuario. Puedes comprobar si existen credenciales de usuario para omitir el flujo de inicio de sesión y acceder al usuario almacenado en caché. Usa esto para abrir un realm sin conexión.

Nota

El inicio de sesión inicial requiere una conexión de red

Cuando un usuario se registra en tu aplicación o inicia sesión por primera vez con una cuenta existente en un cliente, este debe tener conexión de red. Comprobar las credenciales de usuario en caché permite abrir un reino sin conexión, pero solo si el usuario ha iniciado sesión previamente con conexión.

Solo puedes abrir un realm sincronizado sin conexión si no requieres que tu aplicación cliente descargue los cambios antes de abrir el realm.

// You can only open a synced realm offline if there is a cached user credential. If
// there is no app.currentUser, you must log them in, which requires a network connection.
if (app.currentUser == null) {
app.login(Credentials.emailPassword(email, password))
}
// If the app.currentUser isn't null, you can use the cached credential to open the synced
// realm even if the user is offline.
val user = app.currentUser!!
val realm = Realm.open(config)
// Query the realm we opened, and see that it contains data
val offlineToads: RealmResults<Toad> = realm.query<Toad>().find()
Log.v("After opening a realm offline, offlineToads.size is ${offlineToads.size}")
realm.close()

Volver

Agregar sincronización a una aplicación

En esta página