Overview
Nuevo en la versión 1.9.0.
El SDK de Kotlin de Realm permite agrupar archivos realm con la aplicación. Esto permite precargar una base de datos con datos de semilla en la descarga de la aplicación.
Tip
Considere la devolución de datos inicial o las suscripciones iniciales
También puedes agregar datos a tu reino la primera vez que una aplicación lo abre usando InitialDataCallback o Suscripciones Iniciales.
Ubicaciones de Asset Realm por plataforma
El SDK Kotlin Realm busca el reino de activos que contiene sus datos de semilla según las ubicaciones convencionales de la plataforma para activos/recursos agrupados:
Android: A través de
android.content.res.AssetManager.open(assetFilename)Máquina virtual Java:
Class<T>.javaClass.classLoader.getResource(assetFilename)Darwin:
NSBundle.mainBundle.pathForResource(assetFilenameBase, assetFilenameExtension)
Debe colocar el realm del activo en la ubicación apropiada después de crearlo. Si no se puede localizar el realm de activos al abrirlo por primera vez, Realm.open() falla con un IllegalArgumentException.
Agrupar un reino no sincronizado
Rellenar un dominio de activos con datos de semillas
Crea un nuevo proyecto temporal para crear y rellenar un dominio de activos con datos de semilla. Este proyecto utiliza el mismo esquema de objetos de dominio que tu aplicación de producción.
Abra un reino existente con los datos que desea sembrar o cree uno nuevo. Asigne un nombre específico a su reino de activos para que pueda referirse a él por su nombre como fuente de datos inicial para su aplicación.
Complete el ámbito de activos con los datos semilla que desea incluir en su aplicación de producción.
Puede obtener la ruta al archivo del reino del activo usando Realm.configuration.path.
// Open a local realm to use as the asset realm val config = RealmConfiguration.Builder(schema = setOf(Item::class)) .name("asset.realm") .build() val assetRealm = Realm.open(config) assetRealm.writeBlocking { // Add seed data to the asset realm copyToRealm(Item().apply { summary = "Write an awesome app" isComplete = false }) } // Verify the data in the existing realm // (this data should also be in the bundled realm we open later) val originalItems: RealmResults<Item> = assetRealm.query<Item>().find() for(item in originalItems) { Log.v("Item in the assetRealm: ${item.summary}") } // Get the path to the realm Log.v("Realm location: ${config.path}") assetRealm.close()
Ahora que tienes un reino de activos, puedes moverlo a tu aplicación de producción y usarlo allí.
Tip
Los reinos son compatibles entre SDK
Los archivos de dominio que usan el mismo formato son compatibles con todos los SDK. Si necesita crear dominios de recursos programáticamente para integrarlos con una aplicación de producción, puede usar el SDK de Node.js para una integración sencilla con las canalizaciones de CI.
Puedes encontrar el formato de archivo compatible con tu versión del SDK en el registro de cambios. Este podría ser similar a "Formato de archivo: Genera Realms con el formato de archivo v23".
Agrupe y abra el archivo Realm en su aplicación de producción
Guarde la copia del archivo del dominio de activos en su aplicación de producción. Debe colocar este archivo en la ubicación adecuada para la plataforma de su aplicación. Para obtener más información, consulte Ubicaciones de dominios de activos por plataforma.
Crea una Configuración que tu aplicación de producción pueda usar para abrir el activo realm. Define la propiedad
initialRealmFileen esta configuración con el nombre de tu activo realm.Opcionalmente, puede proporcionar un
sha256checkSumpara elinitialRealmFilea fin de verificar la integridad del archivo de dominio al abrirlo. Si proporciona una suma de comprobación que no coincide con la suma de comprobación calculada del archivo de activos al abrir el dominio de la semilla, elRealm.open()falla con unIllegalArgumentException.Con esta configuración, puede abrir el dominio de activos agrupado. Este contiene los datos que se encontraban en el dominio de activos al momento de copiarlo.
// The config should list the bundled asset realm as the initialRealmFile val bundledRealmConfig = RealmConfiguration.Builder(schema = setOf(Item::class)) .initialRealmFile("asset.realm") .build() // After moving the bundled realm to the appropriate location for your app's platform, // open and use the bundled realm as usual. val bundledRealm = Realm.open(bundledRealmConfig) val bundledItems: RealmResults<Item> = bundledRealm.query<Item>().find() for(item in bundledItems) { Log.v("Item in the bundledRealm: ${item.summary}") } bundledRealm.close()
Agrupar un reino sincronizado
Al agrupar un dominio sincronizado, se reduce el tamaño de los datos que los usuarios deben descargar al abrirlo por primera vez, a costa de aumentar el tamaño del archivo de descarga de la aplicación. Al agrupar un dominio de recursos con la aplicación, los únicos datos que los usuarios deben descargar al abrir el dominio son los cambios realizados desde su preparación.
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.
Si su aplicación utiliza Sincronización Flexible, puede cargarla con datos mediante suscripciones de sincronización inicial como alternativa a la creación de un dominio de recursos sincronizado. Con las suscripciones iniciales, no tendrá que preocuparse de que los datos sean más antiguos que el tiempo máximo sin conexión del cliente. Para obtener más información sobre el uso de suscripciones de sincronización, consulte Suscripciones.
Para agrupar un reino sincronizado, realice lo siguiente:
Rellenar un dominio de activos con datos de semillas
Crea un nuevo proyecto temporal para crear y completar el dominio de activos. Este proyecto utiliza el mismo esquema de objetos de dominio que tu aplicación de producción.
Abra el reino sincronizado que desea utilizar como reino de activos.
Rellene el dominio de activos con los datos de inicialización que desea incluir en su aplicación de producción. Debe esperar a que todos los cambios locales se sincronicen con el servidor de sincronización de dispositivos. Utilice uploadAllLocalChanges() y downloadAllServerChanges() para garantizar que se completen todos los procesos de sincronización.
val app = App.create(yourFlexAppId) // Login with user that has the server-side permissions to // read and write the data you want in the asset realm val user = app.login(credentials) // Create a SyncConfiguration to open a synced realm to use as the asset realm val assetRealmConfig = SyncConfiguration.Builder(user, setOf(Item::class)) .name("asset.realm") // Add a subscription that matches the data being added // and your app's backend permissions .initialSubscriptions{ realm -> add( realm.query<Item>("isComplete == $0", false), "Incomplete Items") } .build() val assetRealm = Realm.open(assetRealmConfig) assetRealm.subscriptions.waitForSynchronization(10.seconds) assertEquals(SubscriptionSetState.COMPLETE, assetRealm.subscriptions.state) assetRealm.writeBlocking { // Add seed data to the synced realm copyToRealm(Item().apply { summary = "Make sure the app has the data it needs" isComplete = false }) } // Verify the data in the existing realm // (this data should also be in the bundled realm we open later) val assetItems: RealmResults<Item> = assetRealm.query<Item>().find() for(item in assetItems) { Log.v("Item in the assetRealm: ${item.summary}") } // IMPORTANT: Sync all changes with server before copying the synced realm assetRealm.syncSession.uploadAllLocalChanges(30.seconds) assetRealm.syncSession.downloadAllServerChanges(30.seconds)
Crear una copia del dominio de activos
Debe crear una copia del ámbito de activos desde el proyecto temporal que pueda agrupar con su aplicación de producción.
Crea una SyncConfiguration que tu aplicación pueda usar para abrir una copia del dominio de activos. Establece la
initialRealmFilepropiedad en esta configuración con el nombre del dominio de activos.Opcionalmente, puede proporcionar un
sha256checkSumpara elinitialRealmFilea fin de verificar la integridad del archivo de dominio al abrirlo. Si proporciona una suma de comprobación que no coincide con la suma de comprobación calculada del dominio de la semilla al abrirlo,Realm.open()falla con unIllegalArgumentException.// Create a SyncConfiguration for the bundled copy. // The initialRealmFile value is the `name` property of the asset realm you're bundling. val copyConfig = SyncConfiguration.Builder(user, setOf(Item::class)) .initialRealmFile("asset.realm") .build() Cree una nueva versión del dominio sincronizado con writeCopyTo(). Debe usar
writeCopyTo()para agrupar un dominio sincronizado. Este método elimina los metadatos que asocian el dominio con el usuario, lo que permite que otros usuarios también abran el archivo del dominio.Obtenga la ruta al archivo de reino copiado usando Realm.configuration.path.
// Copy the synced realm with writeCopyTo() assetRealm.writeCopyTo(copyConfig) // Get the path to the copy you just created. // You must move this file into the appropriate location for your app's platform. Log.v("Bundled realm location: ${copyConfig.path}") assetRealm.close()
Ahora que tienes una copia del activo realm, puedes incorporarlo a tu aplicación de producción y utilizarlo allí.
Agrupe y abra un archivo de reino sincronizado en su aplicación de producción
Guarde la copia del archivo del dominio de activos en su aplicación de producción. Debe colocar este archivo en la ubicación adecuada para la plataforma de su aplicación. Para obtener más información, consulte Ubicaciones de dominios de activos por plataforma.
Ahora que tienes una copia del realm de activos empaquetada con tu aplicación, puedes abrirla usando la configuración de realm copiada que creaste. Contiene los datos que estaban en el realm de activos en el momento en que lo copiaste.
// After moving the bundled realm to the appropriate location for your app's platform, // open and use the bundled realm as usual. val copiedRealm = Realm.open(copyConfig) // This should contain the same Items as in the asset realm val copiedItems: RealmResults<Item> = copiedRealm.query<Item>().find() for(item in copiedItems) { Log.v("Item in the copiedRealm: ${item.summary}") } copiedRealm.close()