Podría querer sembrar su aplicación móvil con algunos datos iniciales que estarán disponibles para los usuarios en el lanzamiento inicial de la aplicación. Para lograr esto:
Build a temporary realm app,
Haz una copia de un realm existente (solo con los datos que deseas incluir), y luego
Bundle the Realm file in your app's shared project.
En tu aplicación de producción (la que usará este dominio integrado al cargarse por primera vez), añade algunas líneas de código para extraer el dominio y guardarlo en los datos de la aplicación. Las siguientes secciones proporcionan más información sobre estos pasos.
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 abren 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 cliente se reiniciará.
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.
Crear un archivo de reino para agrupar
Create a new project with the same data models as your production app. Open an existing realm with the data you wish to bundle, or create a new one.
Usa el método WriteCopy() para hacer una copia del realm en una nueva ubicación y/o nombre. El siguiente código lo demuestra.
// open an existing realm var realm = Realm.GetInstance("myRealm.realm"); // Create a RealmConfiguration for the *copy* var config = new RealmConfiguration("bundled.realm"); // Make sure the file doesn't already exist Realm.DeleteRealm(config); // Copy the realm realm.WriteCopy(config); // Want to know where the copy is? var locationOfCopy = config.DatabasePath; Importante
Copiar Realms Sincronizados
Al copiar un realm sincronizado, debes asegurarte de que no haya procesos de sincronización pendientes. Esto se logra llamando a WaitForUploadAsync y WaitForDownloadAsync.
// open an existing realm var existingConfig = new PartitionSyncConfiguration("myPartition", user); var realm = await Realm.GetInstanceAsync(existingConfig); // Create a RealmConfiguration for the *copy* // Be sure the partition name matches the original var bundledConfig = new PartitionSyncConfiguration("myPartition", user, "bundled.realm"); // Make sure the file doesn't already exist Realm.DeleteRealm(bundledConfig); // IMPORTANT: When copying a Synced realm, you must ensure // that there are no pending Sync operations. You do this // by calling WaitForUploadAsync() and WaitForDownloadAsync(): var session = realm.SyncSession; await session.WaitForUploadAsync(); await session.WaitForDownloadAsync(); // Copy the realm realm.WriteCopy(bundledConfig); // Want to know where the copy is? var locationOfCopy = existingConfig.DatabasePath; 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.
Incluya un archivo Realm en su aplicación de producción
Ahora que tiene una copia del dominio con los datos "semilla", debe empaquetarla con su aplicación de producción. El proceso de empaquetado depende de si está creando una aplicación móvil o de Unity:
Navegue hasta la ruta que especificó para el nuevo reino y luego arrastre el archivo de reino recién creado al proyecto MAUI/Xamarin compartido en Visual Studio.
Cuando se le solicite, seleccione Copy the file to the directory.
In the shared project, right-click the realm file you just added, choose Build Action, and then choose EmbeddedResource.
Open your production Unity project.
En la pestaña Proyecto, copie el nuevo archivo de reino a la carpeta Activos. Los activos almacenados aquí están disponibles para la aplicación a través de
Application.dataPathpropiedad.
Nota
Compatibilidad multiplataforma
Los archivos de reino no cifrados son compatibles entre plataformas, por lo que puedes agrupar el archivo en el proyecto compartido.
Open a Realm from a Bundled Realm File
Ahora que tienes una copia del realm incluido en tu aplicación, necesitas añadir código para utilizarlo. El código que se agregue dependerá del tipo de aplicación:
Antes de implementar tu aplicación con el "realm" agrupado, necesitas agregar código para extraer el "realm" de los recursos incrustados, guardarlo en la ubicación de datos de la aplicación y luego abrir este nuevo "realm" en la aplicación. El siguiente código muestra cómo puedes hacer esto durante el arranque de la aplicación. Tenga en cuenta que:
this code only runs when no realm file is found at the specified location (typically only on the initial use of the app), and
La forma de abrir el reino depende de si se trabaja con un reino sincronizado o no. Para más información, consulte "Abrir un reino sin sincronización".
// If you are using a local realm var config = RealmConfiguration.DefaultConfiguration; // If the realm file is a synced realm var app = App.Create(Config.AppId); var user = await app.LogInAsync(Credentials.Anonymous()); config = new PartitionSyncConfiguration("myPartition", user); // Extract and copy the realm if (!File.Exists(config.DatabasePath)) { using var bundledDbStream = Assembly.GetExecutingAssembly() .GetManifestResourceStream("bundled.realm"); using var databaseFile = File.Create(config.DatabasePath); bundledDbStream!.CopyTo(databaseFile); } // Open the Realm: var realm = Realm.GetInstance(config);
The embedded realm is initialized like any other realm in a Unity project:
// After copying the above created file to the project folder, // we can access it in Application.dataPath // If you are using a local realm var config = RealmConfiguration.DefaultConfiguration; // If the realm is synced realm var app = App.Create("myRealmAppId"); var user = await app.LogInAsync(Credentials.Anonymous()); config = new PartitionSyncConfiguration("myPartition", user); if (!File.Exists(config.DatabasePath)) FileUtil.CopyFileOrDirectory(Path.Combine(Application.dataPath, "bundled.realm"), config.DatabasePath); } var realm = Realm.GetInstance(config);