CRUD - 読み取り - C++ SDK
項目一覧
オブジェクトを検索、フィルタリング、ソートすることで、Realm に保存したデータを読み取ることができます。
Realm からの読み取りは通常、次の手順で構成されます。
Realm から特定のタイプのすべてのオブジェクトを取得します。
必要に応じて、結果をフィルタリングします。
クエリ操作は結果のコレクションを返します。 これらのコレクションはライブです。つまり、関連付けられたクエリの最新の結果が常に含まれています。
読み取り特性
これらの 3 つの主要な読み取り特性に関連するアプリのデータアクセス パターンを設計し、データをできるだけ効率的に読み取るようにします。
結果はコピーではない
クエリの結果はデータのコピーではない クエリの結果を変更すると、ディスク上のデータが直接変更されます。 このメモリ マッピングは、結果がライブであることも意味します。つまり、ディスクの現在の状態を常に反映します。
結果は遅延
Realm は、そのクエリの結果を実際に要求した場合にのみクエリを実行します。 この遅延評価により、大規模なデータセットや複雑なクエリを処理するための高パフォーマンスのコードを記述できます。 中間状態を処理するために追加の作業なしに、複数のフィルター操作を連鎖させることができます。
参照は保持されます
Realm のオブジェクトモデルの利点の 1 つは、Realm がオブジェクトのすべての関係を直接参照として自動的に保持することです。 これにより、クエリの結果から関係のグラフを直接走査できます。
直接参照(ポインター)を使用すると、参照を介して関連オブジェクトのプロパティに直接アクセスできます。
他のデータベースでは通常、オブジェクトを直接操作する必要がある場合、データベース ストレージからアプリケーション メモリにオブジェクトがコピーされます。 Because application objects contain direct references, you are left with a choice: copy the object referred to by each direct reference out of the database in case it's needed, or just copy the foreign key for each object and query for the object with that key if it's accessed. 参照されたオブジェクトをアプリケーション メモリにコピーすることを選択すると、アクセスされていないオブジェクトの多くのリソースを使用することができますが、外部キーのみをコピーすることを選択した場合は、参照されたオブジェクトの検索によってアプリケーションが遅くなる可能性があります。
Realm は、ゼロコピーのライブ オブジェクトを使用して、これをすべてバイパスします。 Realm オブジェクト アアクセスはメモリ マッピングを使用してデータベース ストレージを直接指すため、Realm 内のオブジェクトとアプリケーション メモリ内のクエリの結果を区別しません。 このため、どのクエリ結果からでも、Realm 全体にわたる直接参照を走査できます。
クエリ結果の制限
遅延評価の結果、Realm でクエリ結果を制限するために特別なメカニズムは必要ありません。 たとえば、クエリが数千のオブジェクトと一致するが、最初の 10 個のオブジェクトのみをロードする場合は、結果コレクションの最初の 10 個の要素のみにアクセスします。
ページ分割
遅延評価の代わりに、ページ区切りの一般的なタスクが非常に簡単になります。 たとえば、Realm 内の数千のオブジェクトに一致するクエリに関連付けられた結果コレクションがあるとします。 ページごとに 100 個のオブジェクトを表示します。 任意のページに進むには、ターゲット ページに対応するインデックスから、結果コレクションの要素にアクセスします。
Realm オブジェクトの読み取り
特定の型のすべてのオブジェクトのクエリ
Realm 内の特定のタイプのオブジェクトをクエリするには、オブジェクトタイプ をYourClassName
Realm::query[T] ノード<T> 関数に渡します。
これにより、Realm 内の指定された型のすべてのオブジェクトを表す結果オブジェクトが返されます。
auto managedBusinesses = realm.objects<realm::Business>();
オブジェクト プロパティに基づいてクエリをフィルタリングする
フィルターは、1 つ以上のオブジェクト プロパティの値に基づいて結果のサブセットを選択します。 Realm は、フィルターの定義に使用できるフル機能のクエリ エンジンを提供します。
auto businessesNamedMongoDB = managedBusinesses.where( [](auto &business) { return business.name == "MongoDB"; });
サポートされているクエリ演算子
Realm C++ SDK は現在、次のクエリ演算子をサポートしています。
等価(
==
、!=
)より大きいか小さい値(
>
、>=
、<
、<=
)複合クエリ(
||
、&&
)
結果セットのサイズとアクセス結果の確認
Realm結果は、結果を操作するメンバー関数を公開します。 結果セットのサイズを確認したり、特定のインデックスでオブジェクトにアクセスしたりする場合があります。
auto managedBusinesses = realm.objects<realm::Business>(); auto businessesNamedMongoDB = managedBusinesses.where( [](auto &business) { return business.name == "MongoDB"; }); CHECK(businessesNamedMongoDB.size() >= 1); auto mongoDB = businessesNamedMongoDB[0];
さらに、結果を反復処理したり、結果セットを変更を観察したりすることもできます。
マップ プロパティの読み取り
邦土 マッププロパティ の値を標準のC++ マップ と同様に反復して確認できます。
auto employees = realm.objects<realm::Employee>(); auto employeesNamedTommy = employees.where( [](auto &employee) { return employee.firstName == "Tommy"; }); auto tommy = employeesNamedTommy[0]; // You can get an iterator for an element matching a key using `find()` auto tuesdayIterator = tommy.locationByDay.find("Tuesday"); // You can access values for keys like any other map type auto mondayLocation = tommy.locationByDay["Monday"];
セット プロパティの読み取り
セットのサイズを反復処理して確認し、セット プロパティで値を見つけることができます。
auto repositories = realm.objects<realm::Repository>(); auto repositoriesNamedDocsRealm = repositories.where([](auto &repository) { return repository.ownerAndName == "mongodb/docs-realm"; }); auto docsRealm = repositoriesNamedDocsRealm[0]; // You can check the size of the set auto numberOfPullRequests = docsRealm.openPullRequestNumbers.size(); // Find an element in the set whose value is 3064 auto it = managedDocsRealm.openPullRequestNumbers.find(3064); // Get a copy of the set that exists independent of the managed set auto openRealmPullRequests = docsRealm.openPullRequestNumbers.detach();
リストとクエリ結果のソート
ソート操作を使用すると、Realm がリスト オブジェクトとクエリ結果を返す順序を構成できます。 リストまたは結果のコレクション内のオブジェクトの 1 つ以上のプロパティに基づいて並べ替えることができます。 Realm は明示的にソートする場合にのみ一貫した順序を保証します。
std::sort との違い 、Realm のソート実装により、オブジェクトの遅延読み込みが保持されます。結果のセット全体やリスト オブジェクトをメモリにプルすることはなく、アクセスするときにのみメモリにロードします。
並べ替えるには、1 つ以上のsort_descriptorを使用してリストまたは結果セットに対して.sort()
関数を呼び出します。
sort_descriptor
には次のものが含まれます。
ソートする任意のキー パス(string)。
並べ替え順序を指定するブール値。``true`` は昇順、
false
は降順です。
この例では、 priority
の結果セットを降順でソートします。
auto items = realm.objects<realm::Item>(); // Sort with `false` returns objects in descending order. auto itemsSorted = items.sort("priority", false);
複数のソート記述子でリストや結果セットをソートすることもできます。 この例では、 assignee
でリスト プロパティを昇順でソートし、次にpriority
で降順にソートします。
auto sortedListProperty = specificProject.items.sort({{"assignee", true}, {"priority", false}});