Docs Menu
Docs Home
/ /
Atlas Device SDK
/ / /

Realm のバンドル - Flutter SDK

項目一覧

  • ローカル Realm のバンドル
  • バンドル用の Realm ファイルの作成
  • 本番アプリケーションでの Realm ファイルのバンドル
  • バンドルされた Realm ファイルから Realm を開く
  • 同期された Realm のバンドル

アプリの最初の起動時にユーザーが利用できる初期データをモバイルアプリにシードすることができます。 そのためには、Flutter アプリで既存の Realm ファイルをバンドルできます。

アプリが同期された Realm を使用する場合は、それをバンドルしないでください。 詳細については、 「同期された Realm のバンドル」セクションを参照してください。

Tip

初期データのコールバックを検討する

1

本番アプリと同じRealm オブジェクト スキーマを使用して新しいプロジェクトを作成します。 バンドルするデータを使って既存のRealmを開くか、新しいRealmを作成します。

Realm.config.path を使用して Realm ファイルへのパスを取得する プロパティ。

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

Dart スタンドアロン SDK でバンドルされた Realm を作成

次の理由で、Flutter アプリケーション用のバンドルされた Realm を作成するためにDart スタンドアロン SDKを使用することをお勧めします。

  • バンドルされた Realm を作成するには、Flutter UI 要素は必要ありません。

  • Dartスタンドアロン プロジェクトは Flutter プロジェクトよりも必要なパイプライン コードが少なくなります

2

「シード」データを含む Realm のコピーが作成できたら、それを本番アプリケーションにバンドルする必要があります。

Realm ファイルをアプリケーションの Flutter アセット に追加する 。たとえば、プロジェクト内のロケーションassets/bundled.realmにバンドルされた Realm を追加できます。

バンドルされた Realm への参照をpubspec.yamlファイルに追加して、本番アプリケーションに含めます。

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

アプリに含まれる Realm のコピーが作成できたら、それを使用するためのコードを追加する必要があります。

バンドルされている Realm を使用してアプリを配置する前に、埋め込みリソースから Realm を抽出し、アプリのデータロケーションに保存してから、アプリ内でこの新しい Realm を開く必要があります。 次のコードは、アプリの起動時にこれを行う方法を示しています。

ヘルパー関数 initBundledRealmを作成して、バンドルされた Realm がすでにアプリ内に存在するかどうかを確認し、まだ存在しない場合はアプリにロードします。 initBundledRealmrunApp() でアプリのウィジェットのロードを呼び出す前に、 を呼び出します。

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

ほとんどの場合、同期された Realm をバンドルしないでください。 バンドルされた Realm がクライアントの最大オフライン時間よりも過去にアップデートされた場合、ユーザーはバンドルされた Realm ファイルを初めて開くときにクライアントがリセットされます。 クライアント リセットにより、アプリケーションはアプリケーション バックエンドから Realm の完全な状態をダウンロードします。 これにより、Realm ファイルをバンドルする利点が得られません。

同期された Realm をバンドルするのではなく、同期サブスクリプションを使用してアプリケーションにデータを入力できます。 同期サブスクリプションを使用してデータを追加する場合、Flexible Sync の削除機能を活用しながら、クライアントの最大オンライン時間よりも古いデータを心配する必要はありません。 同期サブスクリプションの使用方法の詳細については、「 同期サブスクリプションの管理 」を参照してください。

ユースケースが次の条件を満たす場合にのみ、同期された Realm をバンドルする必要があります。

  • クライアントの最大オフライン時間よりも最近作成された、バンドルされた同期済み Realm を含むバージョンのアプリをユーザーが使用していることを確認できます。

  • バンドルされる初期データは非常に大きくアプリはインターネット帯域幅が限られている状況で使用されているため、同期サブスクリプションを使用した最初のデータダウンロードには時間がかかりすぎます。

  • すべてのアプリ ユーザーには、バンドルに含まれるデータを表示するバックエンド権限が付与されます。 ユーザーがこのデータを表示する権限を持っていない場合、Realm が書込みエラーを修正する経由で Atlas と同期するときに、デバイスから削除されます。

同期された Realm をバンドルするには、次の手順を実行します。

  1. App Services App に接続し、ユーザーを認証します。

  2. Realm にサブスクライブを追加します。 同期された Realm に書き込むには、サブスクリプションが必要です。

  3. 同期された Realm にデータを追加します。

  4. すべてのローカル変更が Device Sync サーバーと同期されるまで待ちます。

  5. Realm.writeCopy() の 使用 同期された Realm の新しいバージョンを作成します。同期された Realm をバンドルするには、 Realm.writeCopy()を使用する必要があります。このメソッドにより、Realm をユーザーに関連付けるメタデータが削除され、他のユーザーも Realm ファイルを開くことができるようになります。

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

バンドルされた Realm を作成したら、上記のセクションの手順に従って、本番アプリケーションで Realm ファイルをバンドルする 、およびバンドルされた Realm ファイルから Realmを開きます 。

戻る

Realm の削除