모델 관계 - Swift SDK
관계 속성 선언
대일 관계 속성 정의
일대일 관계는 한 속성을 다른 객체 유형의 단일 인스턴스에 매핑합니다. 예를 들어 한 사람이 반려견을 최대 한 마리 키우는 것을 일대일 관계로 모델링할 수 있습니다.
관계 필드를 null로 설정하면 객체 간의 연결이 제거됩니다. 그러나 Realm은 참조 된 객체가 포함된 객체가 아닌 이상 참조된 객체를 삭제하지 않습니다.
중요
대일 관계는 선택 사항이어야 합니다.
객체 모델에서 대일 관계를 선언할 때는 선택적 속성이어야 합니다. 대일 관계를 필수로 만들려고 하면 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 }
팁
다음도 참조하세요.
대일 관계에 대한 자세한 내용은 대일 관계를 참조합니다.
앱에서 Device Sync를 사용하는 경우, Swift 객체 모델의 일대일 관계가 Atlas 문서로 변환되는 방식에 대한 자세한 내용은 Device Sync를 사용한 모델 데이터 페이지를 참조하세요.
대다 관계 속성 정의
일대다 관계는 한 속성을 다른 객체 유형의 여러 인스턴스에 매핑합니다. 예를 들어 여러 마리의 반려견을 키우는 사람을 일대다 관계로 모델링할 수 있습니다.
대상 유형으로 태그가 지정된 RLMArray 를 사용하여 다대다 관계 속성 을 정의합니다.
팁
해당 유형에 대한 RLMArray 프로토콜 을 선언하려면유형과 함께 RLM_COLLECTION_TYPE()
매크로를 사용해야 합니다.
// 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
대상 유형으로 태그가 지정된 목록을 사용하여 다대다 관계 속성을 정의합니다.
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 }
팁
다음도 참조하세요.
대다 관계에 대한 자세한 내용은 대다 관계를 참조하세요.
앱에서 Device Sync를 사용하는 경우, Swift 객체 모델의 다대다 관계가 Atlas 문서로 변환되는 방식에 대한 자세한 내용은 Device Sync를 사용한 모델 데이터 페이지를 참조하세요.
역관계 속성 정의
역관계 속성은 자동 역링크 관계입니다. Realm은 해당 일대다 목록 또는 일대일 관계 속성에서 객체가 추가되거나 제거될 때마다 암시적 관계를 자동으로 업데이트합니다. 역관계 속성의 값은 수동으로 설정할 수 없습니다.
관계 를 정의하려면 객체 모델 에서 LinkingObjects 를 사용합니다. 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: }
관계 를 정의하려면 객체 모델 에서 RLMLinkingObjects 를 사용합니다. 클래스에서 +[RLMObject linkingObjectProperties] 메서드를 재정의하여 관계 의 객체 유형과 속성 이름을 지정합니다.
// 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
관계 를 정의하려면 객체 모델 에서 LinkingObjects 를 사용합니다. 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" } }
팁
다음도 참조하세요.
역관계에 대한 자세한 내용은 역관계를 참조하세요.
앱에서 Device Sync를 사용하는 경우 Swift 객체 모델의 역관계가 Atlas 문서로 변환되는 방식에 대한 자세한 내용은 Device Sync를 사용한 데이터 모델링 페이지를 참조하세요.
내장된 객체 속성 정의
내장된 객체는 단일 부모 객체 내에 중첩된 데이터로 존재합니다. 부모 객체의 수명 주기를 상속받으며 독립적인 Realm 객체로 존재할 수 없습니다. Realm은 부모 객체가 삭제되거나 새 내장된 객체 인스턴스로 덮어쓰면 포함된객체를 자동으로 삭제합니다.
참고
Realm은 내장된 객체에 계단식 삭제를 사용함
Realm 객체 를 삭제 하면 해당 객체 가 참조하는 모든 내장된 객체도 함께 삭제됩니다. 부모 객체 를 삭제한 후에도 참조된 객체가 유지되도록 하려면 내장된 객체 가 아닌 유형이어야 합니다. 대신 일대일 관계 일반 Realm 객체 를 사용하세요.
RLMEmbeddedObject 클래스에서 파생하여 내장된 객체 를 정의할 수 있습니다. 다른 유형과 마찬가지로 다른 모델에서 내장된 객체 를 사용할 수 있습니다.
// 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
EmbeddedObject 클래스에서 파생하여 내장된 객체 를 정의할 수 있습니다. 다른 유형과 마찬가지로 다른 모델에서 내장된 객체 를 사용할 수 있습니다.
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? }
팁
다음도 참조하세요.
앱에서 Device Sync를 사용하는 경우 Swift 객체 모델의 내장된 객체가 Atlas 문서로 변환되는 방식에 대한 자세한 내용은 Device Sync를 사용한 데이터 모델링 페이지를 참조하세요.