Docs Menu
Docs Home
/ /
Sincronizar datos

Sincronización basada en particiones - SDK de Java

La sincronización basada en particiones es un modo antiguo para usar Atlas Device Sync con el SDK de Java de Realm. Recomendamos usar la sincronización flexible para las aplicaciones nuevas. La información de esta página está dirigida a los usuarios que aún usan la sincronización basada en particiones.

Tip

El SDK de Java de Realm v10.16.0 y versiones posteriores permiten migrar de la sincronización basada en particiones a la sincronización flexible. Para obtener más información, consulte: Migrar de la sincronización basada en particiones a la sincronización flexible.

Para obtener más información sobre la sincronización basada en particiones y cómo configurarla en Atlas App Services, consulte Sincronización basada en particiones en la documentación de App Services.

Cuando se selecciona Partition-Based Sync para la configuración de la aplicación de backend, la implementación del cliente debe incluir un valor de la partición. Este es el valor del campo clave de partición que se selecciona al configurar la Partition-Based Sync.

El valor de la partición determina a qué datos puede acceder la aplicación cliente.

Pasa el valor de la partición cuando abres un reino sincronizado.

Para configurar los ajustes de un reino, cree una SyncConfiguration con un SyncConfiguration.Builder.

El siguiente ejemplo configura un reino sincronizado con:

  • Sincronización basada en particiones

  • Lecturas sincrónicas permitidas explícitamente en el hilo de UI

  • Escrituras sincrónicas permitidas explícitamente en el hilo de UI

  • Espera explícita a que todos los cambios del backend se sincronicen con el dispositivo antes de devolver un reino abierto

  • Compactación automática al iniciar el reino para ahorrar espacio en el archivo

Advertencia

Las Aplicaciones de Producción Deben gestionar los Restablecimientos del Cliente

Las aplicaciones utilizadas en entornos de producción deben gestionar los errores de restablecimiento de cliente. Para obtener más información, consulte Restablecer un dominio de cliente.

SyncConfiguration config = new SyncConfiguration.Builder(app.currentUser(), PARTITION)
.allowQueriesOnUiThread(true)
.allowWritesOnUiThread(true)
.waitForInitialRemoteData(500, TimeUnit.MILLISECONDS)
.compactOnLaunch()
.build();
Realm.getInstanceAsync(config, new Realm.Callback() {
@Override
public void onSuccess(Realm realm) {
Log.v("EXAMPLE", "Successfully opened a realm.");
}
});
val config =
SyncConfiguration.Builder(app.currentUser(), PARTITION)
.allowQueriesOnUiThread(true)
.allowWritesOnUiThread(true)
.waitForInitialRemoteData(500, TimeUnit.MILLISECONDS)
.compactOnLaunch()
.build()
Realm.getInstanceAsync(config, object : Realm.Callback() {
override fun onSuccess(realm: Realm) {
Log.v("EXAMPLE", "Successfully opened a realm.")
}
})

Importante

Lecturas y escrituras sincrónicas en el hilo de interfaz de usuario

De forma predeterminada, solo se puede leer o escribir en un dominio en el hilo de interfaz de usuario de la aplicación mediante transacciones asincrónicas. Es decir, solo se puede usar Realm métodos cuyo nombre termine con la palabra Async en el hilo principal de su aplicación Android a menos que permita explícitamente el uso de métodos sincrónicos.

Esta restricción existe en beneficio de los usuarios de tu aplicación: realizar operaciones de lectura y escritura en el hilo de la Interfaz de Usuario puede generar interacciones lentas o no respondidas en la Interfaz de Usuario, por lo que generalmente es mejor gestionar estas operaciones de manera asíncrona o en un hilo en segundo plano. Sin embargo, si tu aplicación requiere el uso de lecturas o escrituras de realm síncronas en el hilo de la IU, puedes permitir explícitamente el uso de métodos síncronos con las siguientes opciones SyncConfiguration:

SyncConfiguration config = new SyncConfiguration.Builder(app.currentUser(), PARTITION)
.allowQueriesOnUiThread(true)
.allowWritesOnUiThread(true)
.build();
Realm.getInstanceAsync(config, new Realm.Callback() {
@Override
public void onSuccess(Realm realm) {
Log.v(
"EXAMPLE",
"Successfully opened a realm with reads and writes allowed on the UI thread."
);
}
});
val config = SyncConfiguration.Builder(app.currentUser(), PARTITION)
.allowQueriesOnUiThread(true)
.allowWritesOnUiThread(true)
.build()
Realm.getInstanceAsync(config, object : Realm.Callback() {
override fun onSuccess(realm: Realm) {
Log.v("EXAMPLE", "Successfully opened a realm with reads and writes allowed on the UI thread.")
}
})

Para abrir un dominio sincronizado, llame a getInstanceAsync() y pase un objeto SyncConfiguration. El siguiente código muestra cómo crear un dominio con configuraciones de sincronización específicas creadas con un SyncConfiguration objeto:

SyncConfiguration config = new SyncConfiguration.Builder(app.currentUser(), PARTITION)
.allowQueriesOnUiThread(true)
.allowWritesOnUiThread(true)
.build();
Realm.getInstanceAsync(config, new Realm.Callback() {
@Override
public void onSuccess(Realm realm) {
Log.v(
"EXAMPLE",
"Successfully opened a realm with reads and writes allowed on the UI thread."
);
}
});
val config = SyncConfiguration.Builder(app.currentUser(), PARTITION)
.allowQueriesOnUiThread(true)
.allowWritesOnUiThread(true)
.build()
Realm.getInstanceAsync(config, object : Realm.Callback() {
override fun onSuccess(realm: Realm) {
Log.v("EXAMPLE", "Successfully opened a realm with reads and writes allowed on the UI thread.")
}
})

El código anterior muestra cómo abrir el realm asincrónicamente usando getInstanceAsync(). También puedes abrir un realm de forma síncrona utilizando getInstance(), el cual retorna un realm abierto antes de sincronizar todos los datos desde el backend. Sin embargo, esto puede generar inconsistencias temporales en los datos mientras se descargan los datos remotos y, en general, no se recomienda. Puedes usar la opción de configuración waitForInitialRemoteData() para forzar al SDK a recuperar datos remotos antes de abrir el realm y evitar estas inconsistencias.

El valor de partición especifica qué subconjunto de datos se sincronizará. Normalmente, se trata de un ID de usuario, un ID de proyecto, un ID de tienda o algún otro identificador de categoría de la aplicación que tenga especial relevancia para el usuario actual.

Puedes abrir un reino sincronizado sin conexión con la misma sintaxis que para abrir un reino sincronizado con conexión. No todos los SDK siguen este patrón, por lo que los desarrolladores multiplataforma deben consultar la documentación de cada SDK para obtener más información.

Puedes migrar tu App Services Device Sync Mode de Partition-Based Sync a Flexible Sync. La migración es un proceso automático que no requiere ningún cambio en el código de tu aplicación. La migración automática requiere la versión 10.16.0 o posterior de Realm Java SDK.

La migración le permite conservar sus usuarios y configuración de autenticación de App Services. Flexible Sync ofrece opciones de configuración de permisos más versátiles y una sincronización de datos más granular.

Para obtener más información sobre cómo migrar su aplicación de App Services de sincronización basada en particiones a sincronización flexible, consulte Migrar modos de sincronización de dispositivos.

La migración automática de la sincronización basada en particiones a la sincronización flexible no requiere cambios en el código de cliente. Sin embargo, para facilitar esta funcionalidad, Realm gestiona automáticamente las diferencias entre los dos modos de sincronización mediante:

  • Creación automática de suscripciones de sincronización flexible para cada tipo de objeto donde partitionKey == partitionValue.

  • Inyectar un campo partitionKey en cada objeto si no existe. Esto es necesario para la suscripción automática a Sincronización Flexible.

Si necesita actualizar el código de su cliente después de la migración, considere actualizar su base de código para eliminar las funciones de migración ocultas. Le recomendamos actualizar su base de código cuando:

  • Agregue un nuevo modelo o cambie un modelo en su base de código de cliente.

  • Agrega o cambia funcionalidad que implica leer o escribir objetos de Realm

  • Desea implementar un control más preciso sobre los datos que sincroniza

Realice estos cambios para convertir el código de cliente de sincronización basada en particiones para utilizar la sincronización flexible:

  • Actualiza tu SyncConfiguration.Builder para usar Flexible Sync. Esto implica remover el partitionValue y agregar un conjunto de suscripciones iniciales, si es necesario.

  • Agregue propiedades relevantes a sus modelos de objetos para usarlas en sus suscripciones de Sincronización Flexible. Por ejemplo, podría agregar una propiedad ownerId para permitir que un usuario sincronice solo sus propios datos.

  • Eliminar las suscripciones automáticas de Sincronización Flexible. Si no agregó suscripciones iniciales en SyncConfiguration.Builder, cree manualmente las suscripciones correspondientes.

Para obtener ejemplos de estrategias de permisos de sincronización flexible, incluidos ejemplos de cómo modelar datos para estas estrategias, consulte la Guía de permisos de sincronización de dispositivos.

Al migrar de la sincronización basada en particiones a la sincronización flexible, Realm crea automáticamente suscripciones ocultas de sincronización flexible para su aplicación. La próxima vez que agregue o modifique suscripciones, le recomendamos lo siguiente:

  1. Eliminar las suscripciones generadas automáticamente.

  2. Agregue manualmente las suscripciones relevantes en la base de código de su cliente.

Esto le permite ver toda su lógica de suscripción junta en su base de código para futuras iteraciones y depuraciones.

Para obtener más información sobre las suscripciones de Flexible Sync generadas automáticamente, consulte Migrar la aplicación cliente a Flexible Sync.

Volver

Sincronización en segundo plano

En esta página