関係 - Flutter SDK
Realm モデルから他の Realm モデルを参照できます。 これにより、Realm オブジェクト間に次のタイプの関係を作成できます。
また、ある Realm オブジェクトを別の Realm オブジェクトに直接埋め込み、ネストされたデータ構造を作成することもできます。 埋め込みオブジェクトは関係と似ていますが、追加の制約があります。 これらの制約と埋め込みオブジェクトの作成方法の詳細については、「埋め込みオブジェクト データ型 」ドキュメントを参照してください。
Tip
クエリ関連オブジェクト
Flutter v1.9.0 以降では getBacklinks() を使用できます メソッドを使用して、関係を通じて別のオブジェクトにリンクするオブジェクトを検索します。詳細については、「 クエリ関連オブジェクト 」を参照してください。
対 1 の関係
対 1 の関係とは、あるオブジェクトが 1 つの他のオブジェクトのみに特定の方法で関連付けられていることを意味します。
1 対 1 の関係を設定するには、モデル内に別のモデルであるプロパティを作成します。 複数のオブジェクトが同じオブジェクトを参照できます。
重要
対 1 の関係は任意である必要があります
オブジェクトモデルで 1 の関係を宣言する場合、それは任意の プロパティである必要があります。 対 1 の関係を必要にしようとすると、Realm は実行時に例外をスローします。
()class _Bike { () late ObjectId id; late String name; late _Person? owner; } ()class _Person { () late ObjectId id; late String firstName; late String lastName; late int? age; }
対多の関係
対多の関係とは、オブジェクトが複数のオブジェクトに特定の方法で関連していることを意味します。
アプリケーション内でタイプ List<T>
のプロパティを使用して、1 つのオブジェクトと任意の数のオブジェクトとの間の関係を作成できます。T は Realm モデル クラスです。
()class _Scooter { () late ObjectId id; late String name; late _Person? owner; } ()class _ScooterShop { () late ObjectId id; late String name; late List<_Scooter> scooters; }
逆の関係
逆の関係は、Realm オブジェクトを、1 対多または 1 対多の関係で参照する他の Realm オブジェクトにリンクします。
逆の関係には、次のプロパティがあります。
オブジェクトのモデルでプロパティを逆の関係として明示的に定義する必要があります。 スキーマでは逆の関係を推論できません。
逆の関係は、対応するバックリンクを使用して自動的に更新されます。 手動クエリで同じ Realm オブジェクトのセットを見つけることはできますが、逆関係フィールドによりクエリ コードとエラー容量が削減されます。
逆関係プロパティの値を手動で設定することはできません。 代わりに、関係内でオブジェクトを追加または削除すると、Realm は暗黙的な関係を更新します。
バックリンクは Realm オブジェクトでのみ機能します。 Realm に追加されていないオブジェクトには、バックリンクはまだありません。
たとえば、「ユーザーが多数のタスクを持っている」という対多の関係では、「1 人のユーザーにタスクが属する」という逆関係が自動的に作成されることはありません。 Task オブジェクトモデルで逆の関係を指定しない場合は、別のクエリを実行して、特定のタスクに割り当てられているユーザーを検索する必要があります。
バックリンク の使用 プロパティ注釈 を使用して、逆の関係を定義します。記号 を渡す バックリンクを作成している 1 つまたは複数のフィールドのフィールド名をBacklink()
の引数として指定します。注釈の下の フィールドに、バックリンクするオブジェクトモデルのIterable
を含めます。
()class _User { () late ObjectId id; late String username; // One-to-many relationship that the backlink is created for below. late List<_Task> tasks; } ()class _Task { () late ObjectId id; late String description; late bool isComplete; // Backlink field. Links back to the `tasks` property in the `_User` model. (#tasks) late Iterable<_User> linkedUser; }
注意
Device Sync スキーマには存在しない逆関係
Atlas Device Sync を使用している場合、App Services App のサーバー側 Device Sync スキーマに逆関係は存在しません。 逆関係の値を直接設定できないため、Device Sync スキーマにはその関係は存在しません。
サーバー側の Device Sync スキーマの詳細については、Atlas App Services ドキュメントの「 データモデルの構成と更新 」を参照してください。