モデルデータ - Swift SDK
オブジェクトタイプとスキーマ
Realm アプリケーションは、1 つ以上のサポートされているデータタイプをそれぞれが含むフィールドと値のペアで構成されるオブジェクトとしてデータをモデル化します。
Realmオブジェクトは通常のSwiftまたはObjective-Cクラスですが、 ライブ クエリ などの追加機能もいくつか提供します。 Swift SDKメモリはRealmオブジェクトをネイティブSwiftまたはObjective-Cオブジェクトに直接マッピングするため、 ORM などの特別なデータアクセスライブラリを使用する必要はありません。 。代わりに、 Realmオブジェクトは他のクラスインスタンスと同様に操作できます。
すべての Realm オブジェクトは特定のオブジェクトタイプに準拠します。オブジェクトタイプは、基本的にそのタイプのオブジェクトのプロパティと関係を定義するクラスです。 Realm は、Realm 内のすべてのオブジェクトがオブジェクトタイプのスキーマに準拠していることを保証し、オブジェクトが作成、変更、または削除されるたびにオブジェクトを検証します。
例
次のスキーマでは、string 名、任意の string 品種、誕生日、プライマリキー ID を持つ Dog
オブジェクトタイプを定義します。
// A dog has an _id primary key, a string name, an optional // string breed, and a date of birth. @interface Dog : RLMObject @property RLMObjectId *_id; @property NSString *name; @property NSString *breed; @property NSDate *dateOfBirth; @end @implementation Dog + (NSString *)primaryKey { return @"_id"; } + (NSArray<NSString *> *)requiredProperties { return @[ @"_id", @"name", @"dateOfBirth" ]; } @end
// A dog has an _id primary key, a string name, an optional // string breed, and a date of birth. class Dog: Object { true) var _id: ObjectId (primaryKey: var name = "" var breed: String? var dateOfBirth = Date() }
Realm スキーマ
Realm スキーマは、Realm に含めることができる有効なオブジェクト スキーマのリストです。 すべての Realm オブジェクトは、Realm のスキーマに含まれるオブジェクトタイプに準拠する必要があります。
デフォルトでは、Swift SDK はプロジェクト内のRMObjectまたはRMed Objectから派生するすべてのクラスを Realm スキーマに自動的に追加します。
Realm を開くときにすでにデータが含まれている場合、Realm は各オブジェクトを検証して、そのタイプにオブジェクト スキーマが提供されていること、およびスキーマで指定された制約をすべて満たしていることを確認します。
モデル継承
Realm モデルをサブクラス化してクラス間で動作を共有することはできますが、制限があります。 特に、Realm では次の操作は許可されません。
多形クラス間でのキャスト: サブクラスからサブクラス、サブクラスから親、親からサブクラスへ
複数のクラスを同時にクエリします。たとえば、「親クラスとサブクラスのすべてのインスタンスを取得する」
マルチクラス コンテナ: 親クラスとサブクラスが混在する
List
とResults
Tip
コード サンプルを 確認する これらの制限を回避するには、 を使用します。
バージョン 10.10.0 の新機能: クラス内で@Persisted
と@objc dynamic
のプロパティ宣言を混在させることはできませんが、基本クラスとサブクラス全体で表記スタイルを混在させることはできます。 たとえば、基本クラスには@Persisted var foo: Int
プロパティがあり、サブクラスには@objc dynamic var bar = 0
プロパティがあり、両方が永続的です。 ただし、 @Persisted
プロパティが同じ基本クラスまたはサブクラス内にある場合、 @objc dynamic
プロパティは無視されます。
Swift 構造
Realm はさまざまな理由で、Swift 構造体をモデルとしてサポートしていません。 Realm の設計は「ライブ」オブジェクトに焦点を当てています。 この概念は値型構造体と互換性がありません。 設計上、Realm は次のようなこれらのセマンティクスと互換性のない機能を提供します。
データの低メモリフットプリント
優れた操作パフォーマンス
データの直列化/逆直列化の欠如
つまり、バッキング Realm からオブジェクトをデタッチすると便利な場合があります。 これは通常、理想的な設計上の決定ではありません。 代わりに、開発者はライブラリの一時的な制限の回避策としてこれを使用します。
キー値コーディングを使用して、管理されていないオブジェクトを管理対象オブジェクトのコピーとして初期化できます。 その後、その非管理オブジェクトを他の DNSObject と同様に操作できます。
let standaloneModelObject = MyModel(value: persistedModelObject)
プロパティ
Realm オブジェクトモデルは、プロパティのコレクションです。 最も基本的なレベルでは、モデルを作成すると、宣言によって各プロパティに関する Realm 情報が提供されます。
データ型と、プロパティが任意か必須か
Realm でプロパティを保存するか無視するか
プロパティがプライマリキーであるか、インデックスを作成する必要があるか
プロパティは、Realm オブジェクトタイプ間の関係を確立するためのメカニズムでもあります。
Realm Swift SDK はリフレクションを使用して、実行時にモデル内のプロパティを決定します。 プロジェクトではSWIFT_REFLECTION_METADATA_LEVEL = none
を設定しないでください。そうしないと、Realm はプロパティや列挙型などの型の子を検出できません。 プロジェクトでこの設定のレベルが特に設定されていない場合は、反映はデフォルトで有効になります。
Realm でモデルを表示
バージョン10.21.0の新機能。
クラス プロジェクションを作成することで、Realm オブジェクトのプロパティのサブセットを操作できます。 クラスプロジェクションは、Realm オブジェクトのプロパティの一部またはすべてを渡したり変換したりするクラスです。 クラス プロジェクションを使用すると、オブジェクト モデルの抽象化を使用するビューモデルを構築できます。 これにより、アプリケーション内で Realm オブジェクトの使用とテストが簡素化されます。
クラス プロジェクションでは、オブジェクトのプロパティのサブセットを UI で直接使用したり、変換したりできます。 これにクラスプロジェクションを使用すると、Realm のライブ オブジェクトのすべての利点が得られます。
クラスプロジェクションされたオブジェクトのライブアップデート
変更を観察できます
書込みトランザクション (write transaction) でプロパティに直接変更を適用できます
関係
Realm では、リレーショナルデータベースとは異なり、関係を定義するために、ブリッジ テーブルや明示的な結合は使用されません。 Realm は、埋め込みオブジェクトまたは他の Realm オブジェクトへの参照プロパティを使用して関係を処理します。 これらのプロパティから直接読み取りと書込みを行います。 そのため、クエリ関係は、他のプロパティに対するクエリと同等のパフォーマンスが得られます。
Realm は対 1 、対多、および逆の関係をサポートします。
対 1 の関係
対 1 の関係とは、あるオブジェクトが他の 1 つのオブジェクトに関連していることを意味します。 オブジェクト スキーマでオブジェクトタイプと 1 の関係を定義します。 タイプが関連する Realm オブジェクトタイプであるプロパティを指定します。 たとえば、犬がお気に入りのオブジェクトと 1 対 1 の関係がある場合、
Tip
1 対 1 の関係を定義する方法については、「 対 1 の関係プロパティの定義 」を参照してください。
対多の関係
対多の関係とは、オブジェクトが複数の他のオブジェクトに関連していることを意味します。 Realm では、対多の関係は他のオブジェクトへの参照のリストです。 たとえば、人間が多数の犬を持っている場合があります。
Listは、2 つの Realm タイプ間の対多の関係を表します。 リストは可変です。書込みトランザクション内で、リストに要素を追加および削除できます。 リストはクエリに関連付けられておらず、通常、オブジェクトモデルのプロパティとして宣言されます。
Tip
対多の関係を定義する方法については、「対多の関係プロパティの定義 」を参照してください。
逆の関係
Realm の関係定義は一方向です。 逆の関係は、オブジェクトを参照するオブジェクトにリンクします。 オブジェクトのモデルでプロパティを逆の関係として明示的に定義する必要があります。 逆の関係は、対 1 または対多の関係内のオブジェクトにリンクバックすることができます。
LinkingObjectsコレクションは、2 つの Realm タイプ間の逆の関係を表します。 LinkingObjects コレクションから項目を直接追加または削除することはできません。
逆の関係は、対応するバックリンクを使用して自動的に更新されます。 手動クエリで同じ Realm オブジェクトのセットを見つけることはできますが、逆関係フィールドによりクエリ コードとエラー容量が削減されます。
たとえば、「ユーザーは多数のタスクを持っている」という対多の関係を持つタスク トレースを考えてみましょう。 これでは、「タスクがユーザーに属する」という逆の関係は自動的に作成されません。 逆の関係を作成するには、タスクの所有者を指すタスクに ユーザー プロパティを追加します。 タスクからユーザーへの逆の関係を指定すると、その関係に対してクエリを実行できます。 逆の関係を指定しない場合は、別のクエリを実行して、タスクが割り当てられているユーザーを検索する必要があります。
重要
逆関係プロパティの値を手動で設定することはできません。 代わりに、関係内でオブジェクトを追加または削除すると、Realm は暗黙的な関係を更新します。
関係は、多対 1 または多対多にすることができます。 したがって、次の逆関係にある場合は、ゼロ、1、または複数のオブジェクトが生成されます。
Tip
逆の関係を定義する方法については、「逆の関係プロパティの定義 」を参照してください。