オブジェクト モデル - C++ SDK
項目一覧
Atlas Device SDK アプリケーションでは、それぞれが 1 つ以上のサポートされているデータタイプを含むフィールドと値のペアで構成されるオブジェクトとしてデータをモデル化します。
オブジェクト タイプとスキーマ
すべてのデータベース オブジェクトには、オブジェクトのクラスを参照するオブジェクトタイプがあります。 同じ型のオブジェクトは、それらのオブジェクトのプロパティと関係を定義するオブジェクト スキーマを共有します。
データベース スキーマ
データベース スキーマは、データベースに含まれる可能性のある有効なオブジェクト スキーマのリストです。 すべてのデータベース オブジェクトは、データベースのスキーマに含まれるオブジェクトタイプに準拠する必要があります。
データベースを開くときは、データベースを開くために使用するテンプレートにモデルを渡して、使用可能なモデルを指定する必要があります。 これらのモデルにはスキーマが必要で、このスキーマのリストがデータベース スキーマになります。
データベースを開くときにすでにデータが含まれている場合、SDK は各オブジェクトを検証して、そのタイプにオブジェクト スキーマが提供されていること、およびスキーマで指定されたすべての制約を満たしていることを確認します。
データベースを開く方法の詳細については、「 Realm の構成とオープン - C++ SDK 」を参照してください。
オブジェクトモデル
オブジェクトモデルは、アプリ内のオブジェクトを解釈して保存する方法に関するデータベース情報をデータベースに提供するコア構造です。 C++ SDK オブジェクトモデルは、通常の C++ クラス、またはプロパティのコレクションを含む構造体です。 永続化するプロパティは、サポートされている データ型を使用する必要があります。 プロパティは、オブジェクトタイプ間の関係を確立するためのメカニズムでもあります。
C++ クラスまたは構造体を定義するときは、オブジェクト スキーマも提供する必要があります。 スキーマは、どのプロパティを永続化するか、またデータベース オブジェクトのタイプに関する情報を SDK に提供する C++ マニュアルです。
SDK オブジェクトモデルは realm
名前空間内で定義する必要があります。
オブジェクト スキーマ
C++ SDKオブジェクト スキーマは、特定のオブジェクトタイプのプロパティをマッピングします。 SDK スキーマは、オブジェクトを保存および検索するために必要な情報を SDK に提供するマイクロコマンドです。 永続化するすべてのオブジェクトモデルにはスキーマが付属する必要があり、次のいずれかになります。
REALM_SCHEMA
REALM_EMBEDDED_SCHEMA
REALM_ASYMMETRIC_SCHEMA
realm
名前空間内でスキーマとオブジェクトモデルを定義する必要があります。
新しいオブジェクトタイプの定義
C++ SDK では、モデルを通常の C++ 構造体またはクラスとして定義できます。 オブジェクトタイプ名と、データベースに永続化するプロパティの名前を含むオブジェクト スキーマを指定します。 オブジェクトを データベースに追加すると、SDK はスキーマから省略したプロパティを無視します。
realm
名前空間内でオブジェクトとスキーマを宣言する必要があります。 オブジェクトを使用して CRUD 操作を初期化して実行する際には、 realm
名前空間を使用する必要があります。
namespace realm { struct Dog { std::string name; int64_t age; }; REALM_SCHEMA(Dog, name, age) struct Person { realm::primary_key<int64_t> _id; std::string name; int64_t age; // Create relationships by pointing an Object field to another struct or class Dog *dog; }; REALM_SCHEMA(Person, _id, name, age, dog) } // namespace realm
注意
クラス名は最大 57 文字の UTF-8 文字に制限されています。
プライマリキーの指定
プロパティをオブジェクトのプライマリキーとして指定できます。
プライマリキーを使用すると、オブジェクトを効率的に検索、アップデート、アップサートすることができます。
プライマリキーには、次の制限が適用されます。
オブジェクトモデルごとに定義できるプライマリキーは 1 つだけです。
プライマリキー値は、データベース内のオブジェクトのすべてのインスタンスで一意である必要があります。 重複するプライマリキー値を挿入しようとすると、C++ SDK はエラーをスローします。
プライマリキーの値は不変です。 オブジェクトのプライマリキー値を変更するには、元のオブジェクトを削除し、別のプライマリキー値を持つ新しいオブジェクトを挿入する必要があります。
埋め込みオブジェクトではプライマリキーを定義できません。
Device Syncを使用している場合、モデルには_id
という名前のプライマリキーが必要です。
C++ SDK は、次のタイプのプライマリキーとそのオプションのバリアントをサポートしています。
int64_t
realm::object_id
realm::uuid
std::string
さらに、必須のrealm::enum
プロパティはプライマリキーにすることができますが、プライマリキーとして使用する場合、 realm::enum
はオプションではありません。
primary_key
テンプレートを使用して、プロパティをプライマリキーとして設定します。
struct Person { realm::primary_key<int64_t> _id; std::string name; int64_t age; // Create relationships by pointing an Object field to another struct or class Dog *dog; }; REALM_SCHEMA(Person, _id, name, age, dog)
プロパティを無視
モデルには、データベースに保存されていないプロパティが含まれる場合があります。
データベースは、オブジェクト スキーマに含まれていないプロパティを無視します。
namespace realm { struct Employee { realm::primary_key<int64_t> _id; std::string firstName; std::string lastName; // You can use this property as you would any other member // Omitting it from the schema means the SDK ignores it std::string jobTitle_notPersisted; }; // The REALM_SCHEMA omits the `jobTitle_notPersisted` property // The SDK does not store and cannot retrieve a value for this property REALM_SCHEMA(Employee, _id, firstName, lastName) } // namespace realm
埋め込みオブジェクトの定義
埋め込みオブジェクトは、特定のオブジェクトに関する複雑なデータをモデル化する特殊なタイプのオブジェクトです。 埋め込みオブジェクトは 関係 と似ていますが、追加の制約が付与され、 非正規化されたMongoDB document modelにより自然にマップされます。
C++ SDK は、各埋め込みオブジェクトを単一の特定の親オブジェクト内のネストされたデータとして扱う一意の所有権制約を強制します。 埋め込みオブジェクトは親オブジェクトのライフサイクルを継承し、独立したデータベース オブジェクトとして存在することはできません。 SDK は、親オブジェクトが削除された場合、または新しい埋め込みオブジェクト インスタンスによって上書きされた場合に、埋め込みオブジェクトを自動的に削除します。
埋め込み先のオブジェクトから独立したライフサイクルを持たないオブジェクトを埋め込みオブジェクトとして宣言できます。 これは、関連するオブジェクトが独立したライフサイクルを持つ1 対多または多対多の関係とは異なります。
構造体またはクラス名と、データベースを永続化するプロパティの名前を含むREALM_EMBEDDED_SCHEMA
を指定します。
埋め込みオブジェクトのタイプにポインターを設定して、親オブジェクトの埋め込みオブジェクトとしてプロパティを定義します。
namespace realm { struct ContactDetails { // Because ContactDetails is an embedded object, it cannot have its own _id // It does not have a lifecycle outside of the top-level object std::string emailAddress; std::string phoneNumber; }; REALM_EMBEDDED_SCHEMA(ContactDetails, emailAddress, phoneNumber) struct Business { realm::object_id _id; std::string name; ContactDetails *contactDetails; }; REALM_SCHEMA(Business, _id, name, contactDetails) } // namespace realm
非対称オブジェクトの定義
Data Ingestを使用して、デバイスから Atlas App Services App にリンクされたデータベースにオブジェクトを一方向に同期できます。
asymmetric_object
はrealm::object
とほぼ同じタイプをサポートしていますが、いくつかの例外があります。
非対称オブジェクトは次のタイプにリンクできます。-
object
-embedded_object
-std::vector<embedded_object>
非対称オブジェクトは他のデータベース オブジェクトと同じように機能することはありません。 次の操作はできません。
デバイスデータベースから非対称オブジェクトを削除する
デバイスデータベースから非対称オブジェクトをクエリする
非対称オブジェクトのみを作成できます。その後、Device Sync でアプリにリンクされた Atlas データベースに一方向に同期します。
詳細については、「非対称オブジェクトの作成 」を参照してください。
C++ SDK では、通常の C++ 構造体またはクラスと同じ方法で非対称オブジェクトを定義します。 構造体またはクラス名と、データベースを永続化するプロパティの名前を含むREALM_ASYMMETRIC_SCHEMA
を指定します。
struct WeatherSensorReading { realm::primary_key<realm::object_id> _id{realm::object_id::generate()}; std::string deviceId; double temperatureInFahrenheit; int64_t windSpeedInMph; }; REALM_ASYMMETRIC_SCHEMA(WeatherSensorReading, _id, deviceId, temperatureInFahrenheit, windSpeedInMph)