モデル関係 - Swift SDK
関係プロパティを宣言
To-1 の関係プロパティの定義
対 1 の関係は、1 つのプロパティを別のオブジェクトタイプの 1 つのインスタンスにマッピングします。 たとえば、最大 1 個のコンフィギュレーション犬を持つ人を 1 対 1 の関係としてモデル化できます。
関係フィールドを null に設定すると、オブジェクト間の接続が削除されます。 Realm は参照先のオブジェクトを削除しません。ただし、埋め込みオブジェクトでない限り、参照先のオブジェクトは削除されません。
重要
対 1 の関係は任意である必要があります
オブジェクトモデルで 1 の関係を宣言する場合、それは任意の プロパティである必要があります。 対 1 の関係を必要にしようとすると、Realm は実行時に例外をスローします。
// Dog.h @interface Dog : RLMObject @property NSString *name; // No backlink to person -- one-directional relationship @end // Define an RLMArray<Dog> type RLM_COLLECTION_TYPE(Dog) // Person.h @interface Person : RLMObject @property NSString *name; // A person can have one dog @property Dog *dog; @end // Dog.m @implementation Dog @end // Person.m @implementation Person @end
class Person: Object { var name: String = "" var birthdate: Date = Date(timeIntervalSince1970: 1) // A person can have one dog var dog: Dog? } class Dog: Object { var name: String = "" var age: Int = 0 var breed: String? // No backlink to person -- one-directional relationship }
Tip
以下も参照してください。
対 1 の関係の詳細については、「 対 1 の関係 」を参照してください。
アプリで Device Sync を使用する場合は、Swift オブジェクトモデルの 1 対 1 の関係が Atlas ドキュメントにどのように変換されるかについて、「 Device Sync によるモデルデータ」ページを参照してください。
ToMany 関係プロパティの定義
対多の関係は、1 つのプロパティを別のオブジェクトタイプの 0 件以上のインスタンスにマッピングします。 たとえば、任意の数のコンフィギュレーション犬を持つ人を対多の関係としてモデル化できます。
ターゲット タイプでタグ付けされたRRMArrayを使用して、対多の関係プロパティを定義します。
Tip
ご使用のタイプで RLM_COLLECTION_TYPE()
マイクロを使用して、タイプの RRMArray プロトコルを宣言してください。
// Dog.h @interface Dog : RLMObject @property NSString *name; // No backlink to person -- one-directional relationship @end // Define an RLMArray<Dog> type RLM_COLLECTION_TYPE(Dog) // Person.h @interface Person : RLMObject @property NSString *name; // A person can have many dogs @property RLMArray<Dog *><Dog> *dogs; @end // Dog.m @implementation Dog @end // Person.m @implementation Person @end
ターゲット タイプでタグ付けされたListを使用して、対多関係プロパティを定義します。
class Person: Object { var name: String = "" var birthdate: Date = Date(timeIntervalSince1970: 1) // A person can have many dogs var dogs: List<Dog> } class Dog: Object { var name: String = "" var age: Int = 0 var breed: String? // No backlink to person -- one-directional relationship }
Tip
以下も参照してください。
対多の関係の詳細については、「 対多の関係 」を参照してください。
アプリで Device Sync を使用する場合は、Swift オブジェクトモデルの 対多の関係が Atlas ドキュメントにどのように変換されるかについては、「 Device Sync によるモデルデータ」ページを参照してください。
逆の関係プロパティを定義する
逆関係プロパティは、自動バックリンク関係です。 Realm は、対応する 対多リストまたは 1 つの関係プロパティでオブジェクトが追加または削除されるたびに、暗黙的な関係を自動的に更新します。 逆関係プロパティの値を手動で設定することはできません。
逆の関係を定義するには、オブジェクトモデルでLinkObjectsを使用します。 LinkingObjects
定義は、反転する関係のオブジェクトタイプとプロパティ名を指定します。
class User: Object { true) var _id: ObjectId (primaryKey: var _partition: String = "" var name: String = "" // A user can have many tasks. var tasks: List<Task> } class Task: Object { true) var _id: ObjectId (primaryKey: var _partition: String = "" var text: String = "" // Backlink to the user. This is automatically updated whenever // this task is added to or removed from a user's task list. "tasks") var assignee: LinkingObjects<User> (originProperty: }
逆の関係を定義するには、オブジェクトモデルでRMLinkingObjectsを使用します。 クラス内の+[RMObject linkObjectProperties]メソッドをオーバーライドして、反転する関係のオブジェクトタイプとプロパティ名を指定します。
// Task.h @interface Task : RLMObject @property NSString *description; @property (readonly) RLMLinkingObjects *assignees; @end // Define an RLMArray<Task> type RLM_COLLECTION_TYPE(Task) // User.h @interface User : RLMObject @property NSString *name; @property RLMArray<Task *><Task> *tasks; @end // Task.m @implementation Task + (NSDictionary *)linkingObjectsProperties { return @{ @"assignees": [RLMPropertyDescriptor descriptorWithClass:User.class propertyName:@"tasks"], }; } @end // User.m @implementation User @end
逆の関係を定義するには、オブジェクトモデルでLinkObjectsを使用します。 LinkingObjects
定義は、反転する関係のオブジェクトタイプとプロパティ名を指定します。
class User: Object { @objc dynamic var _id: ObjectId = ObjectId.generate() @objc dynamic var _partition: String = "" @objc dynamic var name: String = "" // A user can have many tasks. let tasks = List<Task>() override static func primaryKey() -> String? { return "_id" } } class Task: Object { @objc dynamic var _id: ObjectId = ObjectId.generate() @objc dynamic var _partition: String = "" @objc dynamic var text: String = "" // Backlink to the user. This is automatically updated whenever // this task is added to or removed from a user's task list. let assignee = LinkingObjects(fromType: User.self, property: "tasks") override static func primaryKey() -> String? { return "_id" } }
Tip
以下も参照してください。
逆の関係の詳細については、「 逆の関係 」を参照してください。
アプリで Device Sync を使用する場合は、Swift オブジェクトモデルの逆関係が Atlas ドキュメントにどのように変換されるかについては、「 Device Sync によるモデルデータ」ページを参照してください。
埋め込みオブジェクト プロパティの定義
埋め込みオブジェクトは、単一の特定の親オブジェクト内にネストされたデータとして存在します。 親オブジェクトのライフサイクルを継承し、独立した Realm オブジェクトとして存在することはできません。 Realm は、親オブジェクトが削除された場合、または新しい埋め込みオブジェクト インスタンスによって上書きされた場合に、埋め込みオブジェクトを自動的に削除します。
注意
Realm は埋め込みオブジェクトに段階的な削除を使用する
Realm オブジェクトを削除すると、そのオブジェクトが参照するすべての埋め込みオブジェクトも削除されます。 親オブジェクトを削除した後も参照されたオブジェクトを保持する場合は、タイプは埋め込みオブジェクトであってはなりません。 代わり に、対 1 の関係を 持つ通常の Realm オブジェクト を使用してください。
RVM埋め込みオブジェクト クラスから派生することで埋め込みオブジェクトを定義できます。 埋め込みオブジェクトは、他のモデルでも他のタイプと同様に使用できます。
// Define an embedded object @interface Address : RLMEmbeddedObject @property NSString *street; @property NSString *city; @property NSString *country; @property NSString *postalCode; @end // Enable Address for use in RLMArray RLM_COLLECTION_TYPE(Address) @implementation Address @end // Define an object with one embedded object @interface Contact : RLMObject @property NSString *name; // Embed a single object. @property Address *address; @end @implementation Contact @end // Define an object with an array of embedded objects @interface Business : RLMObject @property NSString *name; // Embed an array of objects @property RLMArray<Address *><Address> *addresses; @end
埋め込みオブジェクト は、埋め込みオブジェクト クラスから派生して定義できます。 埋め込みオブジェクトは、他のモデルでも他のタイプと同様に使用できます。
class Person: Object { true) var id = 0 (primaryKey: var name = "" // To-many relationship - a person can have many dogs var dogs: List<Dog> // Inverse relationship - a person can be a member of many clubs "members") var clubs: LinkingObjects<DogClub> (originProperty: // Embed a single object. // Embedded object properties must be marked optional. var address: Address? convenience init(name: String, address: Address) { self.init() self.name = name self.address = address } } class DogClub: Object { var name = "" var members: List<Person> // DogClub has an array of regional office addresses. // These are embedded objects. var regionalOfficeAddresses: List<Address> convenience init(name: String, addresses: [Address]) { self.init() self.name = name self.regionalOfficeAddresses.append(objectsIn: addresses) } } class Address: EmbeddedObject { var street: String? var city: String? var country: String? var postalCode: String? }
Tip
以下も参照してください。
アプリで Device Sync を使用する場合は、Swift オブジェクトモデル内の埋め込みオブジェクトが Atlas ドキュメントにどのように変換されるかについて、「 Device Sync によるモデルデータ」ページを参照してください。