Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

モデル関係 - Swift SDK

項目一覧

  • 関係プロパティを宣言
  • To-1 の関係プロパティの定義
  • ToMany 関係プロパティの定義
  • 逆の関係プロパティを定義する
  • 埋め込みオブジェクト プロパティの定義

Tip

以下も参照してください。

あるいは、 関係を定義するApp Services App こともできます。

対 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 {
@Persisted var name: String = ""
@Persisted var birthdate: Date = Date(timeIntervalSince1970: 1)
// A person can have one dog
@Persisted var dog: Dog?
}
class Dog: Object {
@Persisted var name: String = ""
@Persisted var age: Int = 0
@Persisted var breed: String?
// No backlink to person -- one-directional relationship
}

Tip

以下も参照してください。

対 1 の関係の詳細については、「 対 1 の関係 」を参照してください

アプリで Device Sync を使用する場合は、Swift オブジェクトモデルの 1 対 1 の関係が Atlas ドキュメントにどのように変換されるかについて、「 Device Sync によるモデルデータ」ページを参照してください。

対多の関係は、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 {
@Persisted var name: String = ""
@Persisted var birthdate: Date = Date(timeIntervalSince1970: 1)
// A person can have many dogs
@Persisted var dogs: List<Dog>
}
class Dog: Object {
@Persisted var name: String = ""
@Persisted var age: Int = 0
@Persisted var breed: String?
// No backlink to person -- one-directional relationship
}

Tip

以下も参照してください。

対多の関係の詳細については、「 対多の関係 」を参照してください

アプリで Device Sync を使用する場合は、Swift オブジェクトモデルの 対多の関係が Atlas ドキュメントにどのように変換されるかについては、「 Device Sync によるモデルデータ」ページを参照してください。

逆関係プロパティは、自動バックリンク関係です。 Realm は、対応する 対多リストまたは 1 つの関係プロパティでオブジェクトが追加または削除されるたびに、暗黙的な関係を自動的に更新します。 逆関係プロパティの値を手動で設定することはできません。

逆の関係を定義するには、オブジェクトモデルでLinkObjectsを使用します。 LinkingObjects定義は、反転する関係のオブジェクトタイプとプロパティ名を指定します。

class User: Object {
@Persisted(primaryKey: true) var _id: ObjectId
@Persisted var _partition: String = ""
@Persisted var name: String = ""
// A user can have many tasks.
@Persisted var tasks: List<Task>
}
class Task: Object {
@Persisted(primaryKey: true) var _id: ObjectId
@Persisted var _partition: String = ""
@Persisted 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.
@Persisted(originProperty: "tasks") var assignee: LinkingObjects<User>
}

逆の関係を定義するには、オブジェクトモデルで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 {
@Persisted(primaryKey: true) var id = 0
@Persisted var name = ""
// To-many relationship - a person can have many dogs
@Persisted var dogs: List<Dog>
// Inverse relationship - a person can be a member of many clubs
@Persisted(originProperty: "members") var clubs: LinkingObjects<DogClub>
// Embed a single object.
// Embedded object properties must be marked optional.
@Persisted var address: Address?
convenience init(name: String, address: Address) {
self.init()
self.name = name
self.address = address
}
}
class DogClub: Object {
@Persisted var name = ""
@Persisted var members: List<Person>
// DogClub has an array of regional office addresses.
// These are embedded objects.
@Persisted var regionalOfficeAddresses: List<Address>
convenience init(name: String, addresses: [Address]) {
self.init()
self.name = name
self.regionalOfficeAddresses.append(objectsIn: addresses)
}
}
class Address: EmbeddedObject {
@Persisted var street: String?
@Persisted var city: String?
@Persisted var country: String?
@Persisted var postalCode: String?
}

Tip

以下も参照してください。

アプリで Device Sync を使用する場合は、Swift オブジェクトモデル内の埋め込みオブジェクトが Atlas ドキュメントにどのように変換されるかについて、「 Device Sync によるモデルデータ」ページを参照してください。

戻る

オブジェクトモデルを定義する