문서 메뉴
문서 홈
/ /
Atlas Device SDK
/ /

모델 관계 - Swift SDK

이 페이지의 내용

  • 관계 속성 선언
  • 대일 관계 속성 정의
  • 대다 관계 속성 정의
  • 역관계 속성 정의
  • 내장된 객체 속성 정의

다음도 참조하세요.

또한 App Services 앱에서 관계를 정의할 수도 있습니다.

일대일 관계는 한 속성을 다른 객체 유형의 단일 인스턴스에 매핑합니다. 예를 들어 한 사람이 반려견을 최대 한 마리 키우는 것을 일대일 관계로 모델링할 수 있습니다.

관계 필드를 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 {
@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
}

다음도 참조하세요.

대일 관계에 대한 자세한 내용은 관계를 참조하세요.

앱에서 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 {
@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
}

다음도 참조하세요.

대다 관계에 대한 자세한 내용은 대다 관계를 참조하세요.

앱에서 Device Sync를 사용하는 경우, Swift 객체 모델의 다대다 관계가 Atlas 문서로 변환되는 방식에 대한 자세한 내용은 Device Sync를 사용한 모델 데이터 페이지를 참조하세요.

역관계 속성은 자동 역링크 관계입니다. Realm은 해당 일대다 목록 또는 일대일 관계 속성에서 객체가 추가되거나 제거될 때마다 암시적 관계를 자동으로 업데이트합니다. 역관계 속성의 값은 수동으로 설정할 수 없습니다.

역관계를 정의하려면 객체 모델에서 LinkingObjects 를 사용합니다. 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>
}

역관계를 정의하려면 객체 모델에서 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 {
@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?
}

다음도 참조하세요.

앱에서 Device Sync를 사용하는 경우 Swift 객체 모델의 포함된 객체가 Atlas 문서로 변환되는 방식에 대한 자세한 내용은 Device Sync를 사용한 데이터 모델링 페이지를 참조하세요.

돌아가기

객체 모델 정의

다음

지원되는 유형