クイック スタート - C++ SDK
項目一覧
このクイック スタートでは、Realm C++ SDK で Realm を使用する方法を説明します。 開始する前に、C++ SDK がインストールされていることを確認してください。
Realm のインポート
Realm C++ SDK を使用する変換ユニットに cpprealm/sdk.hpp
ヘッダーを含めて、コード内で Realm C++ SDK を使用できるようにします。
オブジェクトモデルを定義する
ローカル専用 Realm の場合、コード内でオブジェクトモデルを直接定義できます。 このクイック スタートでは、オプションの Device Sync を追加する場合を除き、 ownerId
を削除できます。
namespace realm { struct Todo { realm::primary_key<realm::object_id> _id{realm::object_id::generate()}; std::string name; std::string status; // The ownerId property stores the user.identifier() of a // logged-in user. Omit this property for the non-sync example. std::string ownerId; }; REALM_SCHEMA(Todo, _id, name, status, ownerId); } // namespace realm
Realm を開く
Realm を開くときは、 db_configを指定する必要があります。 オプションで、特定のパスで Realm を開くか、同期された Realm を開くためにsync_config
を指定することができます。
auto config = realm::db_config(); auto realm = realm::db(std::move(config));
詳細については、「 Realm の構成とオープン 」を参照してください。
オブジェクトの作成、読み取り、更新、削除
Realm を開くと、 書込みトランザクション ブロックでそのオブジェクトとその オブジェクト を変更できます。
新しい Todo オブジェクトをインスタンス化し、書込みブロックの Realm に追加するには、次の手順に従います。
auto todo = realm::Todo{.name = "Create my first todo item", .status = "In Progress"}; realm.write([&] { realm.add(std::move(todo)); });
Realm 内のすべての Todo のライブ結果コレクションを検索できます。
auto todos = realm.objects<realm::Todo>();
次の条件を使用してそのコレクションをフィルタリングすることもできます。
auto todosInProgress = todos.where( [](auto const& todo) { return todo.status == "In Progress"; });
Todo を変更するには、書込みトランザクション (write transaction) ブロックでそのプロパティを更新します。
auto todoToUpdate = todosInProgress[0]; realm.write([&] { todoToUpdate.status = "Complete"; });
最後に、Todo を削除できます。
realm.write([&] { realm.remove(specificTodo); });
変更の監視
observe
メソッドを使用してオブジェクトの変更を監視できます。
auto token = specificTodo.observe([&](auto&& change) { try { if (change.error) { rethrow_exception(change.error); } if (change.is_deleted) { std::cout << "The object was deleted.\n"; } else { for (auto& propertyChange : change.property_changes) { std::cout << "The object's " << propertyChange.name << " property has changed.\n"; } } } catch (std::exception const& e) { std::cerr << "Error: " << e.what() << "\n"; } });
Realm を閉じる
Realm を閉じてすべての基礎のリソースを解放するには、 db::close()
を呼び出します。 データベースを閉じると、残りのオブジェクトは無効になります。
realm.close();
Device Sync の追加(任意)
デバイス間で Realm データを同期する場合は、Atlas App Services App を設定し、Device Sync を有効にします。 App Services で実行できる操作の詳細については、「アプリケーション サービス - C++ SDK 」を参照してください。
前提条件
Realm データを同期する前に、次の操作を行う必要があります。
開発モード を
On
に切り替えて、 Flexible Sync を有効にします。この例では、Device Sync Queryable FieldsセクションにownerId
フィールドが必要です。
アプリを初期化する
認証や同期などの App Services 機能を使用するには、App ID を使用して App Services App にアクセスします。 アプリ ID は、App Services UI で確認できます。
auto appConfig = realm::App::configuration(); appConfig.app_id = APP_ID; auto app = realm::App(appConfig);
ユーザーの認証
このクイック スタートでは、匿名認証を使用してユーザーをログインさせ、識別情報の提供を要求しません。 ユーザーを認証したら、そのユーザーのRealmを開くことができます。
auto user = app.login(realm::App::credentials::anonymous()).get();
Realm C++ SDK は、ユーザーを認証、登録、リンクするための多くの追加の方法を提供します。 その他の認証プロバイダについては、「ユーザーの認証 - C++ SDK 」を参照してください。
Realm を開く
Device Sync を有効にしてユーザーを認証したら、 sync_configurationオブジェクトを作成し、Realm を開くことができます。 次に、Realm が読み書きできるデータを決定するFlexible Sync サブスクリプションを追加できます。
auto syncConfig = user.flexible_sync_configuration(); auto realm = realm::db(syncConfig); // For this example, get the userId for the Flexible Sync query auto userId = user.identifier(); auto subscriptions = realm.subscriptions(); auto updateSubscriptionSuccess = subscriptions .update([&](realm::mutable_sync_subscription_set& subs) { subs.add<realm::Todo>("todos", [&userId](auto& obj) { // For this example, get only Todo items where the ownerId // property value is equal to the userId of the logged-in user. return obj.ownerId == userId; }); }) .get();
読み取り、 React 、変更への対応
同期された Realm で を読み取り、書込み、変更を監視する構文は、上記の同期されていない Realm の構文と同じです。
唯一の違いは、この例ではログインユーザーのuser.identifier()
がTodo
アイテムのownerId
プロパティに保存されていることです。 これにより、サブスクライブ内のユーザーの Todo のみをクエリし、同期権限をUsers can only read and write their own dataに設定できるようになります。
同期権限の詳細については、ロールベースの権限 を参照してください。
auto todo = realm::Todo{.name = "Create a Sync todo item", .status = "In Progress", .ownerId = userId}; realm.write([&] { realm.add(std::move(todo)); }); auto todos = realm.objects<realm::Todo>();
ローカル データを操作している間に、バックグラウンド スレッドが変更セットを効率的に統合、アップロード、ダウンロードします。
サブスクリプションセットのすべての書込みトランザクション (write transaction) にはパフォーマンス コストがかかります。 セッション中に Realm オブジェクトを複数更新する必要がある場合は、すべての変更が完了するまで編集されたオブジェクトをメモリ内に保持することを検討してください。 これにより、すべての変更ではなく、完全で更新されたオブジェクトのみが Realm に書き込まれるため、同期のパフォーマンスが向上します。