Docs Menu
Docs Home
/ /
Administrar archivos de Realm

Agrupar un reino - SDK de Flutter

Quizás quieras inicializar tu aplicación móvil con datos que estarán disponibles para los usuarios al iniciarla. Para ello, puedes agrupar un archivo de dominio existente en tu aplicación de Flutter.

Si tu aplicación usa un dominio sincronizado, es posible que no quieras agruparlo. Para obtener más información, consulta Agrupa una sección de Reino sincronizado.

Tip

Considere la devolución de datos iniciales

También puedes agregar datos a tu reino la primera vez que una aplicación lo abre usando la función de devolución de llamada de datos iniciales.

1

Crea un nuevo proyecto con el mismo esquema de objetos de Realm que tu aplicación de producción. Abre un reino existente con los datos que deseas agrupar o crea uno nuevo.

Obtenga la ruta al archivo del reino con Realm.config.path propiedad.

print("Bundling realm");
final config = Configuration.local([Car.schema], path: 'bundle.realm');
final realm = Realm(config);
realm.write(() {
realm.add(Car(ObjectId(), "Audi", model: 'A8'));
realm.add(Car(ObjectId(), "Mercedes", model: 'G Wagon'));
});
print("Bundled realm location: " + realm.config.path);
realm.close();

Tip

Crear un dominio agrupado con el SDK independiente de Dart

Es posible que desees utilizar el SDK independiente de Dart para crear el reino incluido para tu aplicación Flutter por los siguientes motivos:

  • La creación de un reino empaquetado no requiere ningún elemento de interfaz de usuario de Flutter.

  • Los proyectos independientes de Dart requieren menos código repetitivo que los proyectos de Flutter

2

Ahora que tiene una copia del reino con los datos "semilla" en él, debe empaquetarlo con su aplicación de producción.

Añade el archivo realm a los recursos de Flutter de tu aplicación. Por ejemplo, podrías añadir el archivo realm incluido en tu proyecto, en la assets/bundled.realm ubicación.

Agregue una referencia al reino incluido a su archivo pubspec.yaml para incluirlo en su aplicación de producción:

pubspec.yaml
flutter:
assets:
- realm/bundle.realm
3

Ahora que tienes una copia del reino incluida con tu aplicación, necesitas agregar código para usarlo.

Antes de implementar la aplicación con el dominio incluido, debe extraerlo 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.

Crear una función auxiliar initBundledRealm Para comprobar si el dominio incluido ya existe en la aplicación y cargarlo si aún no existe. Llama a initBundledRealm antes de llamar a la función de carga de los widgets de la aplicación con runApp().

lib/main.dart
// Also import Realm schema and Flutter widgets
import 'package:flutter/services.dart';
import 'package:realm/realm.dart';
import 'dart:io';
Future<Realm> initBundledRealm(String assetKey) async {
final config = Configuration.local([Car.schema]);
final file = File(config.path);
if (!await file.exists()) {
final realmBytes = await rootBundle.load(assetKey);
await file.writeAsBytes(
realmBytes.buffer
.asUint8List(realmBytes.offsetInBytes, realmBytes.lengthInBytes),
mode: FileMode.write);
}
return Realm(config);
}
void main() async {
WidgetsFlutterBinding.ensureInitialized();
final realm = await initBundledRealm("assets/bundle.realm");
runApp(const MyApp());
}

En la mayoría de los casos,no se recomienda agrupar un dominio sincronizado. Si la última actualización del dominio agrupado fue posterior al tiempo máximo sin conexión del cliente, el usuario experimentará un reinicio del cliente la primera vez que abra el archivo del dominio agrupado. Este reinicio hace que la aplicación descargue el estado completo del dominio desde el backend de la aplicación. Esto anula las ventajas de agrupar un archivo de dominio.

En lugar de agrupar un dominio sincronizado, puede completar su aplicación con datos mediante suscripciones de sincronización. Si agrega datos mediante suscripciones de sincronización, no tendrá que preocuparse de que los datos sean más antiguos que el tiempo máximo en línea del cliente mientras aprovecha la función de recorte de Sincronización Flexible. Para obtener más información sobre el uso de suscripciones de sincronización, consulte Administrar suscripciones de sincronización.

Solo debe agrupar un reino sincronizado si su caso de uso cumple con los siguientes criterios:

  • Puede asegurarse de que los usuarios tengan una versión de la aplicación con el reino sincronizado incluido que se creó más recientemente que el tiempo máximo sin conexión del cliente.

  • Los datos iniciales incluidos son muy grandes y la aplicación se está utilizando en una situación con un ancho de banda de Internet limitado, por lo que una descarga de datos inicial mediante suscripciones de sincronización tomaría demasiado tiempo.

  • Todos los usuarios de la aplicación tienen permiso del backend para ver los datos incluidos en el paquete. Si un usuario no tiene permiso para ver estos datos, se eliminarán de su dispositivo cuando el dominio se sincronice con Atlas mediante un error de escritura compensatorio.

Para agrupar un reino sincronizado, realice lo siguiente:

  1. Conéctese a su aplicación App Services y autentique un usuario.

  2. Añade una suscripción al dominio. Necesitas una suscripción para escribir en un dominio sincronizado.

  3. Agrega datos al realm sincronizado.

  4. Espere a que todos los cambios locales se sincronicen con el servidor de sincronización del dispositivo.

  5. Use Realm.writeCopy() para crear una nueva versión del dominio sincronizado. Debe usar para Realm.writeCopy() agrupar el dominio sincronizado, ya que el método elimina los metadatos que lo asocian con el usuario, lo que permite que otros usuarios también abran el archivo del dominio.

print("Bundling synced realm");
// You must connect to the Device Sync server with an authenticated
// user to work with the synced realm.
final app = App(AppConfiguration(APP_ID));
// Check if current user exists and log anonymous user if not.
final user = app.currentUser ?? await app.logIn(Credentials.anonymous());
final config = Configuration.flexibleSync(user, [Car.schema]);
final realm = Realm(config);
// Add subscription that match the data being added
// and your app's backend permissions.
realm.subscriptions.update((mutableSubscriptions) {
mutableSubscriptions.add(realm.all<Car>());
});
await realm.subscriptions.waitForSynchronization();
// Add data to realm
realm.write(() {
realm.add(Car(ObjectId(), "Audi", model: 'A8'));
realm.add(Car(ObjectId(), "Mercedes", model: 'G Wagon'));
});
// Sync changes with the server
await realm.syncSession.waitForUpload();
await realm.syncSession.waitForDownload();
// Create new configuration for the bundled realm.
// You must specify a path separate from the realm you
// are copying for Realm.writeCopy() to succeed.
final bundledConfig = Configuration.flexibleSync(user, [Car.schema],
path: 'sync_bundle.realm');
realm.writeCopy(bundledConfig);
print("Bundled realm location: " + bundledConfig.path);
realm.close();

Después de crear el reino incluido, siga las instrucciones de las secciones anteriores Agrupar un archivo de reino en su aplicación de producción y Abrir un reino desde un archivo de reino incluido.

Volver

Eliminar un reino

En esta página