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 Data

Partition-Based Sync - Java SDK

Partition-Based Sync is an older mode for using Atlas Device Sync with the Realm Java SDK. We recommend using Flexible Sync for new apps. The information on this page is for users who are still using Partition-Based Sync.

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.

For more information about Partition-Based Sync and how to configure it in Atlas App Services, refer to Partition-Based Sync in the App Services documentation.

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.

You pass in the partition value when you open a synced realm.

Para configurar la configuración de un realm, crea una SyncConfiguration con un SyncConfiguration.Builder.

The following example configures a synced realm with:

  • partition-based Sync

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

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

  • explicit waiting for all backend changes to synchronize to the device before returning an open realm

  • automatic compaction when launching the realm to save file space

Advertencia

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

Las aplicaciones usadas en entornos de producción deben gestionar errores de restablecimiento del cliente. Para aprender más, consulte Restablecer un cliente Realm.

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

Synchronous Reads and Writes on the UI Thread

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 la partición especifica qué subconjunto de tus datos se debe sincronizar. Por lo general, se trata de un ID de usuario, ID del grupo, ID de tienda u otro identificador de categoría en tu aplicación que resulte especialmente relevante para el usuario actual.

Puedes abrir un Realm sincronizado sin conexión con la misma sintaxis exacta que utilizas para abrir un Realm sincronizado en linea. No todos los SDK siguen este patrón, así 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.

Migrating enables you to keep your existing App Services users and authentication configuration. Flexible Sync provides more versatile permissions configuration options and more granular data synchronization.

For more information about how to migrate your App Services App from Partition-Based Sync to Flexible Sync, refer to Migrate Device Sync Modes.

The automatic migration from Partition-Based Sync to Flexible Sync does not require any changes to your client code. However, to support this functionality, Realm automatically handles the differences between the two Sync Modes by:

  • Automatically creating Flexible Sync subscriptions for each object type where partitionKey == partitionValue.

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

Si necesitas realizar actualizaciones en el código cliente después de la migración, considera actualizar tu base de código cliente para remover funcionalidades ocultas de migración. Tal vez quieras actualizar tu base de código de cliente cuando:

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

  • You add or change functionality that involves reading or writing Realm objects

  • Quieres implementar un control más específico sobre los datos que sincronizas

Make these changes to convert your Partition-Based Sync client code to use Flexible Sync:

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

  • Agrega propiedades relevantes a tus modelos de objetos para usarlas en tus suscripciones de Flexible Sync. Por ejemplo, podrías agregar una propiedad ownerId para permitir que un usuario sincronice solo sus propios datos.

  • Remover suscripciones automáticas de Flexible Sync. Si no añadiste suscripciones iniciales en el SyncConfiguration.Builder, debes crear manualmente las suscripciones relevantes.

For examples of Flexible Sync permissions strategies, including examples of how to model data for these strategies, refer to Device Sync Permissions Guide.

When you migrate from Partition-Based Sync to Flexible Sync, Realm automatically creates hidden Flexible Sync subscriptions for your app. The next time you add or change subscriptions, we recommend that you:

  1. Remove the automatically-generated subscriptions.

  2. Manually add the relevant subscriptions in your client codebase.

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

For more information about the automatically-generated Flexible Sync subscriptions, refer to Migrate Client App to Flexible Sync.

Volver

Background Sync

En esta página