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.
Valor de 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.
Pasa el valor de la partición cuando abres un reino sincronizado.
Abrir 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() { 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() { 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.") } })
Abrir un reino sincronizado mientras estás en línea
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 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.
Abrir un reino sincronizado sin conexión
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.
Migrar de la sincronización basada en particiones a la sincronización flexible
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.
Actualización del código del cliente después de la migración
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
partitionKeyen 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
partitionValuey 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
ownerIdpara 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.
Eliminar y crear suscripciones manualmente
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:
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.