Realm permite agrupar archivos de realm. Al agrupar un archivo de realm, se incluye una base de datos y todos sus datos en la descarga de la aplicación.
This allows users to start applications for the first time with a set of initial data. For synced realms, bundling can avoid a lengthy initial download the first time a user opens your application. Instead, users must only download the synced changes that occurred since you generated the bundled file.
Overview
Para crear y agrupar un archivo de reino con su aplicación:
Crea un archivo de reino que contenga los datos que deseas agrupar.
Añade el archivo realm empaquetado a tu aplicación de producción.
En su aplicación de producción, abra el dominio desde el archivo de recursos incluido. Para dominios sincronizados, debe incluir la clave de partición.
Nota
Bundle Synchronized Realms
SDK version 10.12.0 introduced the ability to bundle synchronized realms. Before version 10.12.0, you could only bundle local realms. See the Bundle a Synchronized Realm section for details on considerations and limitations when bundling a synchronized realm.
Crear un archivo de reino para agrupar
Build a temporary realm app that shares the data model of your application.
Open a realm and add the data you wish to bundle. If using a synchronized realm, allow time for the realm to fully sync.
Utiliza el método writeCopyTo() para copiar el realm a un nuevo archivo:
const originalPath = path.join(__dirname, "original.realm"); const originalConfig = { schema: [Car], path: originalPath, }; const originalRealm = await Realm.open(originalConfig); const copyPath = path.join(__dirname, "copy.realm"); originalRealm.writeCopyTo(copyPath); writeCopyTo()automatically compacts your realm to the smallest possible size before copying.Nota
Diferencias entre reinos sincronizados y reinos solo locales
El ejemplo anterior utiliza una SyncConfiguration para configurar un realm sincronizado para el campo
syncde la Configuration. Para crear una copia de un realm local, no incluyas el camposyncen tu objeto Configuration.Tome nota de la ruta del archivo realm incluido, que puede encontrarse en la ubicación especificada en el argumento pasado a
writeCopyTo()en el paso anterior. Necesitarás este archivo para usar el realm incluido en tu aplicación de producción, como se describe en la siguiente sección.temp_realm_app. ├── copyOfDefault.realm ... rest of files in _temp_ application
Incluya un archivo Realm en su aplicación de producción
Ahora que tiene una copia del reino que contiene los datos iniciales, inclúyalo en su aplicación de producción.
Añade el archivo Realm empaquetado creado en la sección anterior a tu aplicación de producción.
. ├── copyOfDefault.realm ... rest of files in _prod_ application
Open a Realm from a Bundled Realm File
Ahora que tienes una copia del realm incluida con tu aplicación de producción, debes agregar código para usarla.
Cree una configuración con la ruta al dominio incluido como valor para el path campo. Pase esa configuración al método Realm.open(). Ahora puede trabajar con los datos de su dominio incluido en el dominio que acaba de abrir.
const copyConfig = { schema: [Car], path: "path/to/bundled/file.realm" }; const copyRealm = await Realm.open(copyConfig);
Agrupa un reino sincronizado
Nota
Solo sincronización de mismo tipo
This method only supports copying a Partition-Based Sync configuration for another Partition-Based Sync user, or a Flexible Sync configuration for another Flexible Sync user. You cannot use this method to convert between a Partition-Based Sync realm and a Flexible Sync realm or vice-versa.
Generally, bundling a synchronized realm works the same as bundling a local-only realm. However, you can only bundle fully synchronized realms. Make sure that the realm has fully synchronized with the server before bundling:
const config = { sync: { user: app.currentUser, partitionValue: app.currentUser.id, }, schema: [Car], }; const realm = await Realm.open(config); // create many changes realm.write(() => { for (let i = 0; i < 25; i++) { realm.create("Car", { make: "Toyota", model: "Prius", miles: i, owner: app.currentUser.id, }); } }); // ensure synchronize all changes before copy await realm.syncSession.uploadAllLocalChanges(); await realm.syncSession.downloadAllServerChanges(); // changes are synchronized -- we can copy the realm realm.writeCopyTo(__dirname + "syncedCopy.realm");
Importante
Agrupación de reinos sincronizados
Si su aplicación backend utiliza Sincronización Flexible, los usuarios podrían experimentar un reinicio del cliente la primera vez que abran el archivo de dominio incluido. Esto puede ocurrir cuando el tiempo máximo sin conexión del cliente está habilitado (esta opción está habilitada por defecto). Si el archivo de dominio incluido se generó más de los días especificados en la configuración de tiempo máximo sin conexión del cliente antes de que el usuario sincronice por primera vez, el usuario experimentará un reinicio del cliente.
Las aplicaciones que reinician el cliente descargan el estado completo del dominio desde el backend de la aplicación. Esto anula las ventajas de agrupar un archivo de dominio. Para evitar reinicios del cliente y conservar las ventajas de agrupar archivos de dominio:
Evite utilizar un tiempo máximo sin conexión del cliente en aplicaciones que agrupan un reino sincronizado.
Si su aplicación utiliza un tiempo máximo de desconexión del cliente, asegúrese de que la descarga de la aplicación siempre incluya un archivo de dominio sincronizado recientemente. Genere un nuevo archivo con cada versión de la aplicación y asegúrese de que ninguna versión permanezca actualizada durante más días que el tiempo máximo de desconexión del cliente.
Further limitations exist when opening a bundled synchronized realm that uses the older Partition-Based Sync. For more information on using realms configured with Partition-Based Sync, refer to Partition-Based Sync - Node.js SDK.