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.
valor de la partición
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.
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() { 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() { 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.") } })
Open a Synced Realm While Online
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() { 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.
Open a Synced Realm While Offline
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.
Migrate from Partition-Based Sync to Flexible Sync
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.
Actualizar el código de cliente después de la migración
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
partitionKeyen 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
partitionValuey 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
ownerIdpara 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.
Remove and Manually Create Subscriptions
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:
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.