Menu Docs

Página inicial do DocsDesenvolver aplicaçõesAtlas Device SDKs

Agrupar um Realm - SDK do Flutter

Nesta página

  • Agrupar um Local Realm
  • Criar um arquivo Realm para agrupamento
  • Agrupe um arquivo Realm em seu aplicativo de produção
  • Abrir um Realm a partir de um arquivo de Realm agrupado
  • Agrupar um realm sincronizado

Talvez você queira semear seu aplicativo móvel com alguns dados iniciais que estarão disponíveis aos usuários no lançamento inicial do aplicativo. Para fazer isso, você pode agrupar um Arquivo de Realm existente em seu aplicativo Flutter.

Se o seu aplicativo usa um domínio sincronizado, talvez você não queira agrupá-lo. Para obter mais informações, consulte a seção Agrupar um domínio sincronizado .

Dica

Considere a chamada de resposta de dados inicial

Você também pode adicionar dados ao seu Realm na primeira vez que uma aplicação abri-lo, usando a função de chamada de resposta de dados inicial.

1

Crie um novo projeto com o mesmo esquema de objetos de Realm que seu aplicativo de produção. Abra um Realm existente com os dados que você deseja agrupar ou crie um novo.

Obtenha o caminho para o arquivo realm com o Realm.config.path propriedade.

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();

Dica

Crie um pacote de realm com o Dart Standalone SDK

Você pode querer usar o Dart autônomo SDK para criar o Realm pacote para sua aplicação Flutter pelos seguintes motivos:

  • Criar um Realm agrupado não requer nenhum elemento da interface do usuário do Flutter.

  • O projeto autônomo do Dart exige menos código boilerplate do que o projeto do Flutter

2

Agora que você tem uma cópia do Realm com os dados "seed", é necessário empacotá-lo com sua aplicação de produção.

Adicione o arquivo realm aos ativos do Flutter do seu aplicativo . Por exemplo, você pode adicionar o domínio agrupado em seu projeto no local assets/bundled.realm.

Adicione uma referência ao Realm ao seu arquivo pubspec.yaml para incluí-lo em sua aplicação de produção:

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

Agora que você tem uma cópia do Realm incluída em seu aplicativo, é necessário adicionar o código para usá-lo.

Antes de implementar seu aplicativo com o Realm agrupado, você precisa extrair o Realm dos recursos incorporados, salvá-lo no local de dados do aplicativo e, em seguida, abrir esse novo Realm no aplicativo. O código a seguir mostra como você pode fazer isso durante a inicialização do aplicativo.

Crie uma função auxiliar initBundledRealm para verificar se o domínio agrupado já existe dentro do aplicativo e carregue-o no aplicativo se ainda não existir. Chame initBundledRealm antes de chamar o carregamento dos widgets do aplicativo com 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());
}

Na maioria dos casos, você não deve agrupar um domínio sincronizado. Se o domínio agrupado tiver sido atualizado pela última vez mais no passado do que o tempo máximo offline do cliente, o usuário sofrerá um reinício do cliente na primeira vez que abrir o arquivo de domínios agrupado. A redefinição do cliente faz com que o aplicativo baixe o estado completo do domínio do backend do aplicativo. Isso nega as vantagens de agrupar um arquivo de domínio.

Em vez de agrupar um domínio sincronizado, você pode preencher seu aplicativo com dados usando assinaturas de sincronização. Se você adicionar dados usando assinaturas de sincronização, não precisará se preocupar com o fato de os dados serem mais antigos do que o tempo máximo on-line do cliente, aproveitando o recurso de reduçãodo Flexible Sync. Para saber mais sobre como usar assinaturas de sincronização, consulte Gerenciar assinaturas de sincronização.

Você só deve agrupar um Realm sincronizado se o seu caso de uso atender aos seguintes critérios:

  • Você pode garantir que os usuários tenham uma versão do aplicativo com o Realm sincronizado em pacote que foi criado mais recentemente do que o tempo máximo offline do cliente.

  • Os dados iniciais agrupados são muito grandes e o aplicativo está sendo usado em uma situação com largura de banda limitada de internet, portanto, um download inicial de dados usando assinaturas de sincronização levaria muito tempo.

  • Todos os usuários do aplicativo têm permissão de backend para visualizar os dados incluídos no pacote. Se um usuário não tiver permissão para visualizar esses dados, ele será removido do dispositivo quando o Realm for sincronizado com o Atlas por meio de um erro de gravação compensatório.

Para agrupar um Realm sincronizado, execute o seguinte:

  1. Conecte-se ao seu aplicativo App Services e autentique um usuário.

  2. Adicione uma assinatura ao Realm. Você precisa de uma assinatura para escrever em um Realm sincronizado.

  3. Adicione dados ao Realm sincronizado.

  4. Aguarde todas as alterações locais para sincronizar com o servidor do Realm Mobile Sync.

  5. Use Realm.writeCopy() para criar uma nova versão do domínio sincronizado. Você deve usar Realm.writeCopy() para agrupar o domínio sincronizado porque o método remove metadados que associam o domínio ao usuário, o que permite que outros usuários abram o arquivo de domínio também.

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();

Depois de criar o Realm, siga as instruções das seções acima Agrupar um Arquivo de Realm em sua aplicação e Abrir um Realm a partir de um Arquivo de Realm agrupado.

← Excluir um arquivo do Realm - SDK do Flutter