Realm 객체 모델 정의 - Kotlin SDK
이 페이지의 내용
이 페이지에서는 Realm 객체 유형과 애플리케이션 데이터 모델 의 일부로 Realm 객체를 정의하는 방법에 대해 설명합니다. 객체 모델 을 정의한 후에는 정의된 객체를 포함하는 스키마 로 Realm을 열고 영역 영역 해당 객체로 작업할 수 있습니다.
코틀린 SDK ( 코틀린 SDK (Kotlin SDK) ) 메모리는 Realm 객체를 네이티브 코틀린 ( 코틀린 (Kotlin) ) 객체에 직접 매핑하므로 특별한 데이터 액세스 라이브러리를 사용할 필요가 없습니다. 애플리케이션 코드 객체 에 선언된 일반 코틀린 (Kotlin) 클래스를 통해 애플리케이션의 데이터 모델 을 정의합니다.
Realm 객체 모델을 정의한 후 Realm 객체를 변경하는 방법을 학습 보려면 객체 모델 변경을 참조하세요 .
참고
Device Sync 로 데이터 모델 정의
앱 에서 Atlas Device Sync 를 사용하는 경우 데이터 모델 을 정의할 때 추가로 고려해야 할 사항이 있습니다. 자세한 내용 은 Device Sync 를 사용한 모델 데이터 - 코틀린 SDK (Kotlin SDK) 를 참조하세요.
RealmObject
Realm 객체 는 다른 클래스 인스턴스 와 마찬가지로 작업할 수 있는 고유한 이름의 코틀린 (Kotlin) 클래스 인스턴스입니다.
각 객체 클래스는 객체 유형 을 나타냅니다. 동일한 유형의 객체는 해당 유형의 객체에 대한 속성 및 관계를 정의하는 객체 스키마 를 주식 합니다. SDK는 영역 의 모든 객체가 해당 객체 유형의 스키마 를 준수하도록 보장 하고 객체가 생성, 수정 또는 삭제될 때마다 객체의 유효성을 검사합니다.
그러나 Realm 객체에는 다음과 같은 제약 조건이 있습니다.
Realm 객체는
RealmObject
클래스 또는 그 하위 클래스인EmbeddedRealmObject
또는AsymmetricRealmObject
에서 상속 되어야 합니다 . Kotlin SDK는 사용자 지정 기본 클래스로부터의 상속을 지원하지 않습니다 .코틀린 SDK ( 코틀린 SDK (Kotlin SDK) )를 사용하려면 Realm 객체에 빈 생성자가 있어야 합니다. 다음 섹션에 설명된 해결 방법 예시 를 참조하세요.
클래스 이름은 최대 57자의 UTF-8 문자로 제한됩니다.
또한 코틀린 SDK (Kotlin SDK) 는 코틀린 (Kotlin) 데이터 클래스 사용을 지원 하지 않습니다 . 데이터를 모델링합니다. 이는 데이터 클래스가 일반적으로 변경할 수 없는 데이터에 사용되며, 이는 Realm 코틀린 SDK (Kotlin SDK) 의 데이터 모델링 방식에 반하기 때문입니다.
새 객체 유형 정의
새 객체 유형을 정의하려면 RealmObject
, EmbeddedRealmObject
또는 AsymmetricRealmObject
인터페이스를 구현하는 고유한 이름의 코틀린 (Kotlin) 클래스를 만들어야 합니다.
참고
클래스 이름은 최대 57자의 UTF-8 문자로 제한됩니다.
그런 다음 다음을 포함한 객체의 속성을 지정합니다.
각 속성의 데이터 유형 입니다. 코틀린 SDK (Kotlin SDK)는 다음과 같은 데이터 유형을 지원합니다.
Realm 객체의 속성에 기능을 추가하는 모든 속성 주석. 주석을 사용하여 다음을 수행할 수 있습니다.
속성 을 기본 키 지정
속성 을 인덱싱 가능으로 표시
속성 무시
속성 또는 클래스 이름을 다른 이름에 매핑
다른 Realm 객체와의 모든 관계 .
Realm 객체 모델을 정의한 후에는 Realm을 영역 때 객체 클래스 설정하다 를 Realm의 구성에 전달한 다음 영역 에서 해당 객체로 작업할 수 있습니다.
중요
Realm 에는 빈 생성자가 필요합니다.
Realm 코틀린 SDK (Kotlin SDK)는 단일 프라이머리 생성자를 지원하지 않습니다 . SDK에서 객체를 생성하려면 빈 생성자가 필요합니다. 이 문제를 해결하려면 다음과 유사한 작업을 수행할 수 있습니다.
class Person(var name: String, var age: Int): RealmObject { constructor(): this("", 0) // Empty constructor required by Realm }
Realm 객체 유형 정의
Realm 객체 유형을 정의하려면 RealmObject 인터페이스를 구현하는 Kotlin 클래스를 생성합니다.
// Implements the `RealmObject` interface class Frog : RealmObject { // Empty constructor required by Realm var _id: ObjectId = ObjectId() var name: String = "" var age: Int = 0 var species: String? = null var owner: String? = null }
포함된 객체 유형 정의
EmbeddedRealmObject
은(는) 특정 객체에 대한 복잡한 데이터를 모델링하는 특수한 유형의 Realm 객체입니다. Realm은 각 포함된 객체를 단일 특정 상위 객체 내에 중첩된 데이터로 취급합니다.
이 때문에 포함된 객체에는 다음과 같은 제약 조건이 있습니다.
포함된 객체에는 상위 객체가 필요하며 독립적인 Realm 객체로 존재할 수 없습니다 . 상위 객체가 더 이상 포함된 객체를 참조하지 않으면 포함된 객체가 자동으로 삭제됩니다.
내장된 객체 는 상위 객체 의 수명 주기를 상속합니다. 예를 예시 상위 객체 를 삭제 하면 내장된 객체 도 삭제됩니다.
포함된 객체는 상위 객체 에 대해 엄격한 소유권을 갖습니다. 내장된 객체 를 다른 상위 객체 에 다시 할당하거나 여러 상위 내장된 객체 를 주식 할 수 없습니다 .
포함된 객체는 기본 키 를가질 수 없습니다 .
팁
참조된 객체 의 라이프사이클을 수동으로 관리 해야 하거나 상위 객체 삭제 후에도 참조된 객체를 유지하려면 대신 to-one 관계 가 있는 일반 Realm 객체 를 사용하세요. 자세한 내용은 관계 - 코틀린 SDK (Kotlin SDK) 를 참조하세요.
내장된 객체 유형을 정의하려면 EmbeddedRealmObject 인터페이스를 구현하는 Kotlin 클래스를 생성합니다.
// Implements `EmbeddedRealmObject` interface class EmbeddedAddress : EmbeddedRealmObject { // CANNOT have primary key var street: String? = null var city: String? = null var state: String? = null var postalCode: String? = null var propertyOwner: Contact? = null }
포함된 객체 유형은 재사용 및 구성이 가능합니다. 다른 포함된 객체 유형 내의 여러 상위 객체 유형에 동일한 포함된 객체 유형을 사용할 수 있습니다.
내장된 객체 유형을 정의한 후에는 데이터 모델 에서 상위 객체 와의 관계 를 정의해야 합니다. 방법을 학습 보려면 내장된 객체 정의를 참조하세요.
비대칭 객체 유형 정의
버전 1.10.0의 새로운 기능.
AsymmetricRealmObject
은(는) Atlas Device Sync 기능 데이터 수집 (데이터 수집)와 함께 사용하기 위한 삽입 전용 객체 입니다. 애플리케이션 에서 데이터 수집 을 설정하다 하는 방법에 대한 자세한 내용은 Atlas - 코틀린 SDK (Kotlin SDK) 로 데이터 스트리밍을 참조하세요.
비대칭 객체는 몇 가지 예외를 제외하고 RealmObject
과 동일한 속성 유형을 광범위하게 지원 합니다.
비대칭 객체는 Flexible Sync로 구성된 동기화된 영역에서만 사용할 수 있습니다. 그러나 비대칭 객체에 대한 구독은 생성할 수 없습니다.
AsymmetricRealmObject
는EmbeddedRealmObject
유형을 포함 할 수 있지만RealmObject
유형 또는 기타AsymmetricRealmObject
유형은 포함할 수 없습니다.AsymmetricRealmObject
유형은 다른 Realm 객체의 속성으로 사용할 수 없습니다 .
또한 비대칭 객체는 다른 Realm 객체와 동일한 방식으로 작동하지 않습니다. 영역 에서 비대칭 객체 를 추가, 읽기, 업데이트 또는 삭제 수 없습니다. 비대칭 객체 만 만들 수 있으며, 이 객체는 Device Sync 를 통해 앱에 연결된 Atlas 데이터베이스 에 단방향으로 동기화됩니다. 그런 다음 Realm 은 동기화 후 이 객체 를 삭제합니다.
비대칭 객체 유형을 정의하려면 AsymmetricRealmObject 인터페이스를 구현하는 Kotlin 클래스를 생성합니다.
// Implements the `AsymmetricRealmObject` interface class WeatherSensor : AsymmetricRealmObject { var id: ObjectId = ObjectId() var deviceId: String = "" var temperatureInFarenheit: Float = 0.0F var barometricPressureInHg: Float = 0.0F var windSpeedInMph: Int = 0 }
코틀린 SDK (Kotlin SDK) 버전 1.11.1 이하에서는 AsymmetricRealmObject
유형에서 RealmObject
유형으로 링크할 수 없습니다. SDK 버전 1.12.0 이상에서는 AsymmetricRealmObject
유형이 EmbeddedRealmObject
유형 외에도 RealmObject
유형에 연결될 수 있습니다.
컬렉션 속성 정의
컬렉션 은 지원되는 데이터 유형 의 인스턴스를 0개 이상 포함하는 객체 입니다. Realm 컬렉션은 동질적이며( 컬렉션 의 모든 객체는 동일한 유형임) 해당 내장 코틀린 (Kotlin) 클래스로 지원됩니다. 코틀린 SDK ( 코틀린 SDK (Kotlin SDK) )에서 사용되는 컬렉션 유형과 지원되는 데이터 유형에 대한 자세한 내용은 컬렉션 유형을 참조하세요 .
코틀린 SDK ( 코틀린 SDK (Kotlin SDK) )는 데이터 모델 에서 속성으로 사용할 수 있는 여러 컬렉션 유형 RealmList
, RealmSet
, RealmDictionary
을 제공합니다.
컬렉션을 사용하면 Realm 객체 간의 대다 관계를 정의할 수도 있습니다. 자세한 내용은 관계 - 코틀린 SDK (Kotlin SDK) 를 참조하세요.
중요
컬렉션 속성 초기화
컬렉션 유형은 null이 아닙니다. 컬렉션 속성 을 정의할 때는 반드시 초기화해야 합니다.
RealmList 정의
속성 을 RealmList 로 정의하려면 객체 스키마 내에서 해당 유형을 RealmList<E>
로 지정하고 realmListOf()를 사용하여 기본값 을 초기화합니다.
// RealmList<E> can be any supported primitive // or BSON type, a RealmObject, or an EmbeddedRealmObject class Frog : RealmObject { var _id: ObjectId = ObjectId() var name: String = "" // List of RealmObject type (CANNOT be nullable) var favoritePonds: RealmList<Pond> = realmListOf() // List of EmbeddedRealmObject type (CANNOT be nullable) var favoriteForests: RealmList<EmbeddedForest> = realmListOf() // List of primitive type (can be nullable) var favoriteWeather: RealmList<String?> = realmListOf() } class Pond : RealmObject { var _id: ObjectId = ObjectId() var name: String = "" }
RealmSet 정의
속성 을 RealmSet 로 정의하려면 객체 스키마 내에서 해당 유형을 RealmSet<E>
로 지정하고 realmSetOf()를 사용하여 기본값 을 초기화합니다.
// RealmSet<E> can be any supported primitive or // BSON type or a RealmObject class Frog : RealmObject { var _id: ObjectId = ObjectId() var name: String = "" // Set of RealmObject type (CANNOT be nullable) var favoriteSnacks: RealmSet<Snack> = realmSetOf() // Set of primitive type (can be nullable) var favoriteWeather: RealmSet<String?> = realmSetOf() } class Snack : RealmObject { var _id: ObjectId = ObjectId() var name: String = "" }
RealmDictionary/RealmMap 정의
속성 을 RealmDictionary 로 정의하려면 객체 스키마 내에서 해당 유형을 RealmDictionary<K, V>
로 지정하고 realmDictionaryOf()를 사용하여 기본값 을 초기화합니다.
// RealmDictionary<K, V> can be any supported // primitive or BSON types, a RealmObject, or // an EmbeddedRealmObject class Frog : RealmObject { var _id: ObjectId = ObjectId() var name: String = "" // Dictionary of RealmObject type (value MUST be nullable) var favoriteFriendsByPond: RealmDictionary<Frog?> = realmDictionaryOf() // Dictionary of EmbeddedRealmObject type (value MUST be nullable) var favoriteTreesInForest: RealmDictionary<EmbeddedForest?> = realmDictionaryOf() // Dictionary of primitive type (value can be nullable) var favoritePondsByForest: RealmDictionary<String?> = realmDictionaryOf() }
Realm에서는 지도 키에 .
또는 $
문자를 사용할 수 없습니다. 백분율 인코딩 및 디코딩을 사용하여 허용되지 않는 문자 중 하나가 포함된 지도 키를 저장할 수 있습니다.
// Percent encode . or $ characters to use them in map keys val mapKey = "Hundred Acre Wood.Northeast" val encodedMapKey = "Hundred Acre Wood%2ENortheast"
비정형 데이터 정의
버전 2.0.0에 추가 되었습니다.
코틀린 SDK (Kotlin SDK) 버전 2.0.0 부터 RealmAny
속성 내에 혼합 데이터 컬렉션을 저장 수 있습니다. 이 기능 을 사용하면 엄격한 데이터 모델 을 정의하지 않고도 JSON 또는 MongoDB 문서와 같은 복잡한 데이터 구조를 모델링할 수 있습니다.
구조화되지 않은 데이터 는 예상 스키마 를 쉽게 준수하지 않는 데이터로, 개별 데이터 클래스를 모델링하기가 어렵거나 비실용적입니다. 예를 예시 앱 에 매우 가변적인 데이터나 런타임에 구조를 알 수 없는 동적 데이터가 있을 수 있습니다.
컬렉션을 혼합 속성 에 저장하면 Device Sync 사용 시 성능 동기화를 포함하여 기능을 희생하지 않고도 유연성을 확보할 수 있습니다. 혼합되지 않은 컬렉션 과 동일한 방식으로 작업할 수 있습니다.
혼합 컬렉션을 최대 100 수준까지 중첩할 수 있습니다.
혼합 컬렉션의 변경React 을 쿼리 하고 이에 대응할 수 있습니다.
개별 혼합 컬렉션 요소를 찾고 업데이트 할 수 있습니다.
그러나 혼합된 컬렉션에 데이터를 저장하는 것은 구조화된 스키마 를 사용하거나 JSON blob을 단일 string 속성 으로 직렬화하는 것보다 성능이 떨어집니다.
앱 에서 구조화되지 않은 데이터를 모델링하려면 스키마 에서 적절한 속성을 RealmAny 유형으로 정의합니다. 그런 다음 이러한 RealmAny
속성을 RealmList 또는 RealmAny
요소의 RealmDictionary 컬렉션 으로 설정하다 수 있습니다. RealmAny
는 RealmSet
또는 내장된 객체 를 나타낼 수 없습니다 .
팁
유형을 알 수 없지만 각 값에 고유 식별자가 있는 경우 혼합 데이터 유형의 맵을 사용합니다.
유형을 알 수 없지만 객체의 순서가 의미 있는 경우 혼합 데이터 유형 목록을 사용합니다.