Realm ファイルのバンドル - .NET SDK
アプリの最初の起動時にユーザーが利用できる初期データをモバイルアプリにシードすることができます。 そのためには、次の操作を行います。
一時的な Realm アプリを構築します
既存のRealm(バンドルするデータのみ)のコピーを作成し、
アプリの共有プロジェクトにRealm ファイルをバンドルします。
本番アプリ(最初のロード時にこのバンドルされた Realm を使用するアプリ)では、Realm を抽出し、アプリ データに保存するための数行のコードを追加します。 次のセクションでは、これらの手順の詳細について説明します。
重要
同期された Realm のバンドル
バックエンド アプリケーションで Flexible Syncを使用している場合、バンドルされている Realm ファイルを初めて開くときにクライアントがリセットされる可能性があります。 これは、クライアント最大オフライン時間が有効になっている場合に発生する可能性があります(クライアントの最大オフライン時間はデフォルトで有効になっています)。 ユーザーが最初に同期する前に、バンドルされた Realm ファイルがクライアントの最大オフライン時間設定で指定された日数を超えて生成された場合、ユーザーはクライアントをリセットします。
クライアントリセットを実行するアプリケーションは、アプリケーション バックエンドから Realm の完全な状態をダウンロードします。 これにより、Realm ファイルをバンドルする利点が得られません。 クライアントのリセットを防ぎ、Realm ファイルのバンドルの利点を維持するには、次の手順に従います。
同期された Realm をバンドルするアプリケーションでは、クライアントの最大オフライン時間を使用しないでください。
アプリケーションがクライアントの最大オフライン時間を使用する場合は、アプリケーションのダウンロードに最近同期された Realm ファイルが常に含まれていることを確認してください。 アプリケーション バージョンごとに新しい ファイルを生成し、クライアントの最大オフライン時間数を超えてどのバージョンも最新の状態に維持します。
バンドル用の Realm ファイルの作成
本番アプリと同じデータモデルで新しいプロジェクトを作成します。 バンドルするデータを使って既存のRealmを開くか、新しいRealmを作成します。
WriteCopy()メソッドを使用して、Realm を新しい場所や名前にコピーします。 次のコードは、これを示しています。
// 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; 重要
同期された Realm のコピー
同期済み Realm をコピーするときは、保留中の同期プロセスがないことを確認する必要があります。 そのためには、 WaitForUploadAsyncと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; 注意
同じタイプの同期のみ
このメソッドは、別のパーティションベースの同期ユーザーのパーティションベースの同期構成、または別の Flexible Sync ユーザーの Flexible Sync 構成のコピーのみをサポートします。 このメソッドを使用して、 パーティションベースの同期 Realm と Flexible Sync レルムの間で、またはその逆に変換することはできません。
本番アプリケーションでの Realm ファイルのバンドル
「シード」データを含む Realm のコピーが作成できたら、それを本番アプリケーションにバンドルする必要があります。 バンドルのプロセスは、モバイル アプリをビルドするか Unity アプリをビルドするかによって異なります。
新しい Realm に指定したパスに移動し、新しく作成した Realm ファイルを Visual Studio の共有Maui / Xamarinプロジェクトにドラッグします。
プロンプトが表示されたら、 Copy the file to the directoryを選択します。
共有プロジェクトで、先ほど追加した Realm ファイルを右クリックしてからBuild Actionを選択し、次にEmbeddedResourceを選択します。
本番環境の Unity プロジェクトを開きます。
[ プロジェクト ] タブで、新しい Realm ファイルをアセットフォルダーにコピーします。 ここに保存されているアセットは、
Application.dataPath
プロパティを介してアプリで利用できます。
注意
クロスプラットフォーム互換性
暗号化されていない Realm ファイルは複数のプラットフォームに互換性があるため、共有プロジェクトにファイルをバンドルできます。
バンドルされた Realm ファイルから Realm を開く
アプリに含まれる Realm のコピーが作成できたら、それを使用するためのコードを追加する必要があります。 追加するコードは、アプリの種類によって異なります。
バンドルされた Realm を使用してアプリを配置する前に、埋め込みリソースから Realm を抽出し、アプリのデータロケーションに保存してから、アプリ内でこの新しい Realm を開くためのコードを追加する必要があります。 次のコードは、アプリの起動時にこれを行う方法を示しています。 注意すること:
このコードは、指定された場所で Realm ファイルが見つからない場合にのみ実行されます(通常はアプリの最初の使用時にのみ実行されます)。
Realm をどのように開くかは、同期された Realm を操作しているかどうかによって異なります。 詳細については、 「 同期なしで Realm を開く 」を参照してください。
// 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);
埋め込み Realm は、Unity プロジェクト内の他の Realm と同様に初期化されます。
// 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);