Realm の構成とオープン - C++ SDK
項目一覧
Realmは、Realm 内のデータを整理するために使用される主要データ構造です。 Realm は、アプリケーション内で使用するオブジェクト(Realm オブジェクトと呼ばれる)と、オブジェクトを記述する追加のメタデータのコレクションです。
Realm を開くときは、 db_configを指定する必要があります。 db_config
には次のような情報が含まれている場合があります。
Realm がデバイスに保存されるオプションのパス
Realm が管理するモデルの任意のリスト
実行ループをカスタマイズする必要がある場合は、オプションのスケジューラー
Device Sync で Realm を使用する場合は
sync_config
Realm ファイルパス、Device Sync 構成、またはその他の構成詳細を指定する必要がない場合は、デフォルトのdb_config
コンストラクターを使用できます。
Realm ファイル
Realm は、Realm 内のすべてのオブジェクトとタイプのバイナリ エンコード バージョンを単一の.realm
ファイルに保存します。 ファイルは、Realm を開くときに定義できる特定のパスにあります。 を使用してこれらのファイルの内容を開いて表示、編集できます。
移動ファイル
SDK は、各 Realm に対して追加のファイルを作成します。
Realm ファイルの拡張子は「realm」。例:
default.realm
: オブジェクト データが含まれています。ロックファイル、"lock" の拡張子を持つファイル。例:
default.realm.lock
: Realm 内のどのバージョンのデータがアクティブに使用されているかを追跡する。 これにより、クライアント アプリケーションによってまだ使用されているストレージ領域が Realm により再利用されるのを防止します。メモ ファイルの拡張子は "note" で、例:
default.realm.note
: スレッド間通知とプロセス間通知を有効にします。管理ファイル、"management" で呼び出されるファイル。例:
default.realm.management
: 内部状態マネジメント。
同期された Realm
Realm を構成して、それぞれがデータのローカル コピーを持つ多数のデバイス間でデータを自動的に同期できます。 同期された Realm にはsync_config
が必要で、同期プロセスを処理するには Atlas App Services バックエンドが必要です。
アプリケーションは、オフラインでも、ローカルで同期された Realm オブジェクトをいつでも作成、変更、削除できます。 ネットワーク接続が利用可能になるたびに、Realm SDK はアプリケーション サーバーへの接続を開き、他のクライアントとの間での変更を同期します。 Atlas Device Sync プロトコルとサーバー側の運用変換により、特定の変更がオフラインで発生したり、正しい順序で受信されなかった場合でも、Realm の完全に同期されたすべてのインスタンスが完全に同じデータを参照することが保証されます。
同期された Realm と同期されていない Realm
同期された Realm と同期されていないローカル Realm とはいくつかの違いがあります。
同期された Realm ではバックエンドの App Services Appと変更が同期されようとしますが、同期されていない Realm では変更が同期されません。
同期された Realm には認証されたユーザーのみがアクセスでき、同期されていない Realm にはユーザーまたは認証の概念がありません。
同期済み Realm を使用すると、Realm を開く前に更新をダウンロードできます。 ただし、Realm を開く前にダウンロードする変更を要求するには、ユーザーがオンラインである必要があります。 同期されていない Realm は、いつでもオフラインで使用できます。
同期されていない Realm から同期された Realm に、またはその逆にデータを手動でコピーすることはできますが、同期されていない Realm は同期できません。
非同期 Realm を開く
デフォルトのコンストラクターを使用して、現在のディレクトリでRealmを開くことができます。 または、特定のファイルパスを使用してdb_config
を構築し、特定の場所でRealmを開くこともできます。
デフォルトのRealmを開きます
オプション パスを指定せずにRealmを起動すると、現在のディレクトリにデフォルトのRealmが開きます。
Realm を開くと、C++ SDK はプロジェクトで使用可能なモデルを自動的に推測できます。 非対称オブジェクトと一方向にデータを同期するためにRealmを開く場合を除き、使用可能なモデルを手動で指定する必要はありません。 詳細については、このページの「 同期された Realm の開き方 」を参照してください。
auto config = realm::db_config(); auto realm = realm::db(std::move(config));
Tip
Android アプリの作成
Realm C++ SDK を使用する Android アプリを作成する場合は、 db_configコンストラクターのpath
パラメーターにfilesDir.path
を渡す必要があります。 詳しくは、「 Android アプリを作成する 」を参照してください。
ファイルパスでの Realm のオープン
set_path()
を使用して、Realm を開くときに使用するdb_config
のパスを指定できます。
auto relative_realm_path_directory = "custom_path_directory/"; std::filesystem::create_directories(relative_realm_path_directory); // Construct a path std::filesystem::path path = std::filesystem::current_path().append(relative_realm_path_directory); // Add a name for the database file path = path.append("employee_objects"); // Add the .realm extension path = path.replace_extension("realm"); // Set the path on the config, and open the database at the path auto config = realm::db_config(); config.set_path(path); auto realmInstance = realm::db(std::move(config));
Tip
Android アプリの作成
Realm C++ SDK を使用する Android アプリを作成する場合は、 db_configコンストラクターのpath
パラメーターとしてfilesDir.path
を渡す必要があります。 詳しくは、「 Android アプリを作成する 」を参照してください。
同期された Realm を開く
デバイス間でデータを同期するには 、Flexible Sync 用に構成し た Atlas App Services App が必要です。
同期された Realm を開くには、次の手順に従います。
Atlas App Services アプリに接続します。
ユーザーを認証します。
同期構成を作成します。
ユーザーの同期された Realm を 構成で開きます。
// Initialize the App, authenticate a user, and open the database auto appConfig = realm::App::configuration(); appConfig.app_id = APP_ID; auto app = realm::App(appConfig); auto user = app.login(realm::App::credentials::anonymous()).get(); auto syncConfig = user.flexible_sync_configuration(); auto syncedRealm = realm::db(syncConfig);
同期された Realm を開くときは、Realm が管理するモデルをオープン 関数のテンプレート パラメーター リストに渡す必要はありません。 これは、非推奨の文字列 API からの変更です。
このルールの唯一の例外は、同期済み Realm を開き、 asymmetric_object
型を同期することです。 同期済み Realm を開き、 asymmetric_object
型を同期する場合は、オープン 関数のテンプレート パラメータ リストでオブジェクトを明示的に指定する必要があります。 詳細については、「 Atlas へのデータのストリーム - C++ SDK 」を参照してください。
Tip
Android アプリの作成
Realm C++ SDK を使用する Android アプリを作成する場合は、 db_configコンストラクターのpath
パラメーターにfilesDir.path
を渡す必要があります。 詳しくは、「 Android アプリを作成する 」を参照してください。
HTTP headers同期された を使用する場合にカスタム を設定するRealm
でカスタム を使用するHTTP headers Device Syncには、アプリ と でヘッダーを設定する必要があります。flexible_sync_configuration()
構成を初期化した後、set_custom_http_headers()
メンバー関数を使用してカスタムHTTP headersをstringヘッダーキーと値のマップに設定します。
std::map<std::string, std::string> customHeaders; customHeaders.emplace("CUSTOM_HEADER_NAME", "CUSTOM_HEADER_VALUE"); auto syncConfig = user.flexible_sync_configuration(); syncConfig.set_custom_http_headers(customHeaders);
これで、同期された Realm は、すべての Device Sync ネットワーク リクエストにヘッダーを使用できるようになります。
Realm へのモデルのサブセットの提供
Tip
低メモリ制約での動作
一部のアプリケーションでは、メモリのフットプリントが厳密に制約されています。 To optimize your realm memory usage for low-memory environments, open the realm with a subset of models.
デフォルトでは、C++ SDK は実行可能にオブジェクト スキーマを持つすべてのオブジェクトタイプをデータベース スキーマに自動的に追加します。
ただし、Realm でモデルのサブセットのみを管理する場合は、 realm::open()
関数のテンプレート パラメータ リストに渡すことでモデルを指定できます。
auto config = realm::db_config(); auto realm = realm::open<realm::Dog>(std::move(config));
Realm を閉じる
メモリリークを避けるため、データベースを使用しなくなったらデータベースを閉じます。 データベースを閉じると、残りのオブジェクトは無効になります。 db::close()
を使用してデータベースを閉じます。
// Create a database configuration. auto config = realm::db_config(); auto realm = realm::db(config); // Use the database... // ... later, close it. realm.close(); // You can confirm that the database is closed if needed. CHECK(realm.is_closed()); // Objects from the database become invalidated when you close the database. CHECK(specificDog.is_invalidated());