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:
Crea una aplicación de reino temporal,
Haga una copia de un reino existente (solo con los datos que desea agrupar) y luego
Agrupe el archivo Realm en el proyecto compartido de su aplicación.
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
Crea un nuevo proyecto con los mismos modelos de datos que tu aplicación de producción. Abre un dominio existente con los datos que quieres agrupar o crea uno nuevo.
Utilice el método WriteCopy() para crear una copia del dominio en una nueva ubicación 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 reinos sincronizados
Al copiar un dominio sincronizado, debe asegurarse de que no haya procesos de sincronización pendientes. Para ello, llame 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 del mismo tipo
Este método solo permite copiar una configuración de sincronización basada en particiones para otro usuario de sincronización basada en particiones, o una configuración de sincronización flexible para otro usuario de sincronización flexible. No se puede usar este método para convertir entre un dominio de sincronización basada en particiones y uno de sincronización flexible, ni viceversa.
Agrupar un archivo de reino 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.
En el proyecto compartido, haga clic derecho en el archivo de reino que acaba de agregar, elija Build Action y luego elija EmbeddedResource.
Abra su proyecto de producción de Unity.
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 entre plataformas
Los archivos de reino no cifrados son compatibles entre plataformas, por lo que puedes agrupar el archivo en el proyecto compartido.
Abrir un reino desde un archivo de reino incluido
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 la aplicación con el dominio incluido, debe agregar código para extraer el dominio de los recursos integrados, guardarlo en la ubicación de datos de la aplicación y, a continuación, abrir este nuevo dominio en la aplicación. El siguiente código muestra cómo hacerlo durante el inicio de la aplicación. Tenga en cuenta lo siguiente:
Este código solo se ejecuta cuando no se encuentra ningún archivo de reino en la ubicación especificada (normalmente solo en el uso inicial de la aplicación) y
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);
El reino incrustado se inicializa como cualquier otro reino en un proyecto de Unity:
// 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);