Docs Menu
Docs Home
/ /
모델 데이터

지원되는 유형 - Kotlin SDK

이 페이지에서는 객체 모델에서 속성을 정의하는 데 사용할 수 있는 지원되는 데이터 형식에 대해 설명합니다. 객체 모델을 정의하는 방법에 대한 자세한 내용은 객체 모델 정의를 참조하세요.

특정 데이터 유형이 App Services 스키마의 BSON types에 매핑되는 방법을 학습 보려면 Atlas App Services 문서에서 데이터 모델 매핑 을 참조하세요.

코틀린 SDK (Kotlin SDK) 고유 식별자, 타임스탬프, 카운터 및 컬렉션에 사용할 수 있는 다음과 같은 코틀린 (Kotlin) 유형, BSON 유형 및 Realm별 유형을 지원합니다.

Kotlin SDK는 기본적으로 다음을 지원하지 않습니다.

  • 사용자 정의 열거형 속성. Realm 객체에서 열거형을 사용하는 방법에 대한 자세한 내용은 열거형 섹션을 참조하세요.

  • Kotlin의 기본 제공 Date 또는 Instant. Realm 객체에서 타임스탬프를 사용하는 방법에 대한 자세한 내용은 RealmInstant 섹션을 참조하세요.

Realm 객체 속성은 반드시 변경 가능해야 하고 선언 시 초기화되어야 합니다. Kotlin SDK는 현재 추상 속성을 지원하지 않습니다. 기본 제공 ? Kotlin 연산자를 사용하여 속성을 선택적(null 허용)으로 선언하거나 속성을 선언할 때 기본값을 지정할 수 있습니다.

참고

Realm은 십진수가 아닌 모든 숫자 유형을 Long 값으로 저장하고 모든 십진수 숫자 유형을 Double 값으로 저장합니다.

Kotlin 데이터 유형

다음 표에는 지원되는 Kotlin 데이터 유형과 이를 객체 모델에서 필수 또는 선택적 속성으로 선언하는 방법의 예가 나와 있습니다.

Kotlin 데이터 유형
필수 사항
옵션

String

var stringReq: String = ""
var stringOpt: String? = null

Byte

var byteReq: Byte = 0
var byteOpt: Byte? = null

Short

var shortReq: Short = 0
var shortOpt: Short? = null

Int

var intReq: Int = 0
var intOpt: Int? = null

Long

var longReq: Long = 0L
var longOpt: Long? = null

Float

var floatReq: Float = 0.0f
var floatOpt: Float? = null

Double

var doubleReq: Double = 0.0
var doubleOpt: Double? = null

Boolean

var boolReq: Boolean = false
var boolOpt: Boolean? = null

Char

var charReq: Char = 'a'
var charOpt: Char? = null

MongoDB BSON Types

다음 표에는 지원되는 MongoDB BSON 데이터 유형과 이를 객체 모델에서 필수 또는 선택적 속성으로 선언하는 방법의 예가 나와 있습니다. 이러한 유형을 사용하려면 org.mongodb.kbson 패키지에서 가져와야 합니다.

MongoDB BSON 유형
필수 사항
옵션
var objectIdReq: ObjectId = ObjectId()
var objectIdOpt: ObjectId? = null

Decimal128

var decimal128Req: Decimal128 = Decimal128("123.456")
var decimal128Opt: Decimal128? = null

Realm별 유형

다음 표에는 지원되는 Realm별 데이터 유형과 이를 객체 모델에서 필수 또는 선택적 속성으로 선언하는 방법의 예시가 나와 있습니다.

Realm별 유형
필수 사항
옵션
var uuidReq: RealmUUID = RealmUUID.random()
var uuidOpt: RealmUUID? = null
var realmInstantReq: RealmInstant = RealmInstant.now()
var realmInstantOpt: RealmInstant? = null

N/A

var realmAnyOpt: RealmAny? = RealmAny.create("foo")
var mutableRealmIntReq: MutableRealmInt = MutableRealmInt.create(0)
var mutableRealmIntOpt: MutableRealmInt? = null
var listReq: RealmList<CustomObjectType> = realmListOf()

N/A

var setReq: RealmSet<String> = realmSetOf()

N/A

var dictionaryReq: RealmDictionary<String> = realmDictionaryOf()

N/A

N/A

var realmObjectPropertyOpt: CustomObjectType? = null

N/A

var embeddedProperty: EmbeddedObjectType? = null

코틀린 SDK (Kotlin SDK) Realm 객체의 고유 식별자로 UUIDObjectId 를 지원합니다.

참고

ObjectId 대신 UUID 사용하기

일반적으로 고유 식별자 역할을 하는 모든 필드에 UUID를 사용할 수 있습니다. MongoDB에 저장되지 않은 데이터를 마이그레이션하는 경우 UUID 사용이 특히 유용할 수 있습니다. 왜냐하면 이 경우 객체의 고유 식별자가 이미 UUID 유형일 가능성이 높기 때문입니다.반면에 MongoDB에 이미 존재하는 데이터 컬렉션에는 ObjectId를 사용하는 것이 유용할 수 있습니다.

ObjectId MongoDB 전용 BSON 유형입니다. 객체의 식별자로 사용할 수 있는 전역적으로 고유한 12바이트 값입니다. 이는 null을 허용하며, 인덱싱이 가능하고 기본 키로 사용할 수 있습니다.

ObjectId()를 사용하여 ObjectId를 초기화할 수 있습니다.

중요

io.realm.kotlin.types.ObjectId 버전 1.5.0에서 더 이상 사용되지 않음

Realm 코틀린 SDK (Kotlin SDK) 버전 1.5.0 이상에서는 io.realm.kotlin.types.ObjectId 는 더 이상 사용되지 않습니다. 대신 org.mongodb.kbson.ObjectId 에서 ObjectId 를 가져와야 합니다.

UUID (Universal Unique Identifier)는 객체의 식별자로 사용할 수 있는 16바이트 고유 값입니다. 이는 null을 허용하며, 인덱싱이 가능하고 기본 키로 사용할 수 있습니다.

Realm RFC 버전 4122 4 을 준수하고 임의의 바이트로 생성되는 RealmUUID 유형으로 UUID를 생성합니다.

RealmUUID.random( RealmUUID 또는 UUID 형식의 string 을 RealmUUID.from()에 전달합니다:

val uuid1 = RealmUUID.from("46423f1b-ce3e-4a7e-812f-004cf9c42d76")
val uuid2 = RealmUUID.random()

코틀린 SDK (Kotlin SDK) 여러 분산된 클라이언트에서 숫자 변경 사항을 정확하게 동기화하기 위한 논리적 카운터로 사용할 수 있는 특수 정수 유형으로 MutableRealmInt를 제공합니다. Long 처럼 작동하지만 충돌 없는 복제된 데이터 유형 구현 incrementdecrement 메서드도 지원합니다. 이렇게 하면 순서에 관계없이 숫자 업데이트를 동일한 값으로 수렴할 수 있습니다.

MutableRealmInt 속성입니다:

  • 기본 키로 사용할 수 없습니다

  • null 값은 저장할 수 없지만 null을 허용하도록 선언할 수 있습니다(MutableRealmInt?).

또한 MutableRealmInt 필드입니다:

  • Kotlin의 숫자 유형에 의해 지원되므로 숫자 필드 MutableRealmInt로 변경할 때 마이그레이션이 필요하지 않습니다.

  • Long에서 제공하는 것과 유사한 연산자 및 접두사 함수를 사용할 수 있습니다. 하지만 set, increment, decrement 이외의 작업은 해당 작업이 실행되는 인스턴스를 변경하지 않는다는 점에 유의합니다. 대신 업데이트된 값으로 관리되지 않는 새 MutableRealmInt 인스턴스를 생성합니다.

MutableRealmInt (카운터) 속성 생성MutableRealmInt (카운터) 속성 업데이트 방법을 알아보세요.

Kotlin의 기본 제공 Date 또는 Instant 유형을 Realm에 저장할 수 없습니다.

대신, Kotlin SDK는 RealmInstant 유형을 사용하여 시간 정보를 Unix 시간 타임스탬프로 저장합니다.

RealmInstant 이외의 형식으로 타임스탬프 데이터가 필요한 경우 다음 예제를 기반으로 모델 클래스에 전환 코드를 추가할 수 있습니다.

// model class that stores an Instant (kotlinx-datetime) field as a RealmInstant via a conversion
class RealmInstantConversion : RealmObject {
private var _timestamp: RealmInstant = RealmInstant.from(0, 0)
public var timestamp: Instant
get() {
return _timestamp.toInstant()
}
set(value) {
_timestamp = value.toRealmInstant()
}
}
fun RealmInstant.toInstant(): Instant {
val sec: Long = this.epochSeconds
// The value always lies in the range `-999_999_999..999_999_999`.
// minus for timestamps before epoch, positive for after
val nano: Int = this.nanosecondsOfSecond
return if (sec >= 0) { // For positive timestamps, conversion can happen directly
Instant.fromEpochSeconds(sec, nano.toLong())
} else {
// For negative timestamps, RealmInstant starts from the higher value with negative
// nanoseconds, while Instant starts from the lower value with positive nanoseconds
// TODO This probably breaks at edge cases like MIN/MAX
Instant.fromEpochSeconds(sec - 1, 1_000_000 + nano.toLong())
}
}
fun Instant.toRealmInstant(): RealmInstant {
val sec: Long = this.epochSeconds
// The value is always positive and lies in the range `0..999_999_999`.
val nano: Int = this.nanosecondsOfSecond
return if (sec >= 0) { // For positive timestamps, conversion can happen directly
RealmInstant.from(sec, nano)
} else {
// For negative timestamps, RealmInstant starts from the higher value with negative
// nanoseconds, while Instant starts from the lower value with positive nanoseconds
// TODO This probably breaks at edge cases like MIN/MAX
RealmInstant.from(sec + 1, -1_000_000 + nano)
}
}

버전 2.0.0에서 변경됨: RealmAny 에는 혼합 데이터의 목록과 사전을 저장할 수 있습니다.

RealmAny 는 null을 허용하지 않는 혼합 데이터 유형 을 나타냅니다. 이는 포함된 값 유형처럼 작동합니다. RealmAny 는 다음을 보유할 수 있습니다.

  • 지원되는 코틀린 (Kotlin) 데이터 유형 ( Byte, Char, Int, Long, Short 값은 내부적으로 int64_t 값으로 변환됩니다)

  • 지원 가능한 BSON 유형

  • RealmListRealmDictionary 혼합 데이터 컬렉션

  • 다음 Realm별 유형을 사용할 수 있습니다:

    • RealmInstant

    • RealmUUID

    • RealmObject(객체의 복사본이 아닌 객체에 대한 참조를 보유합니다.)

RealmAny EmbeddedRealmObject 유형, RealmSet 또는 다른 RealmAny 을(를) 보유 할 수 없습니다 .

RealmAny 속성:

RealmList, RealmDictionary 또는 RealmSet 필드에 여러 개의 RealmAny 인스턴스를 저장할 수 있습니다.

조건 표현식으로 다형성 처리하기

값을 추출하려면 저장된 유형을 알아야 하므로 when 표현식을 사용하여 RealmAny 유형과 가능한 내부 값 클래스를 처리하는 것이 좋습니다.

버전 2.0.0 이상에서 RealmAny 데이터 유형 은 RealmAny 요소의 컬렉션(세트는 제외 )( 설정하다 은 제외)을 보유할 수 있습니다. 혼합 컬렉션을 사용하여 구조화되지 않은 데이터 또는 가변 데이터를 모델링할 수 있습니다. 자세한 내용은 구조화되지 않은 데이터 정의를 참조하세요.

  • 혼합 컬렉션을 최대 100 수준까지 중첩할 수 있습니다.

  • 일반 컬렉션 과 마찬가지로 혼합 컬렉션 속성을 쿼리 하고 변경 사항에 대한 리스너를 등록 할 수 있습니다.

  • 개별 혼합 컬렉션 요소를 찾고 업데이트 할 수 있습니다.

  • 혼합 컬렉션에는 세트 또는 포함된 객체를 저장 수 없습니다 .

앱 에서 혼합 컬렉션을 사용하려면 다른 RealmAny 유형과 동일한 방식으로 데이터 모델 에서 혼합 유형 속성 을 정의합니다. 그런 다음 RealmAny.create() 를 사용하여 목록 또는 사전 컬렉션을 만듭니다.

Kotlin SDK는 데이터 모델에서 속성으로 사용할 수 있는 여러 collection 유형을 제공합니다. collection은 하나의 Realm 유형의 인스턴스를 0개 이상 포함하는 객체입니다. Realm 컬렉션은 동질적입니다(컬렉션의 모든 객체는 같은 타입입니다) 그리고 이는 관련 빌트인 Kotlin 클래스에 의해 지원됩니다.

collection 유형은 null이 아닙니다. collection 속성을 정의할 때는 반드시 초기화해야 합니다. 자세한 내용은 collection 생성을 참조하세요.

RealmList 유형은 Kotlin의 List 인터페이스를 구현합니다. 관리되지 않는 목록은 Kotlin의 MutableList처럼 작동합니다.

RealmList 는 다음을 포함하는 대다 관계를 나타냅니다.

RealmList<E> 다음을 충족하는 null이 아닌 유형입니다.

  • RealmObject 또는 EmbeddedRealmObject 요소 목록은 null을 허용하지 않습니다 .

  • 다른 지원되는 요소의 목록은 무효화할 수 있습니다(RealmList<E?>).

RealmSet 유형은 Kotlin의 Set 인터페이스를 구현합니다. 관리되지 않는 세트 는 Kotlin의 MutableSet처럼 작동합니다.

RealmSet는 다음과 같은 고유 값을 포함하는 to-many 관계를 나타냅니다.

RealmSet에는 EmbeddedRealmObject요소를 사용할 수 없습니다.

RealmSet<E> 다음을 충족하는 null이 아닌 유형입니다.

  • RealmObject 요소 세트는 null을 허용하지 않습니다 .

  • 지원되는 다른 요소의 세트는 null시킬 수 있습니다(RealmSet<E?>).

RealmMap 유형은 Kotlin의 인터페이스를 구현하며 고유 키가 있는 키-값 String 쌍을 포함하는 연관 배열 입니다. RealmDictionaryString 키와 문자열이 아닌 값을 허용하는 특수 RealmMap 입니다. 관리되지 않는 딕셔너리는 Kotlin의 LinkedHashMap처럼 작동합니다.

RealmDictionary 값은 다음과 같을 수 있습니다.

RealmDictionary<K, V> 다음을 충족하는 null이 아닌 유형입니다.

  • 키는 문자열

  • RealmObject 또는 EmbeddedRealmObject는 null 값을 허용해야 합니다 (RealmDictionary<K, V?>).

  • 다른 지원되는 요소 값은 모두 무효화할 수 있습니다.

AsymmetricRealmObject을(를) 제외한 RealmObject 및 하위 클래스를 객체 모델의 속성으로 사용할 수 있습니다.

중요

AsymmetricRealmObject 속성으로 사용할 수 없습니다. 자세한 내용은 비대칭 객체를 참조하세요.

RealmObject 유형은 속성으로 사용할 수 있는 사용자 지정 객체를 나타냅니다.

RealmObject 속성:

  • 는 null이 가능해야 합니다.

  • 컬렉션의 요소로 사용할 수 있습니다.

  • RealmAny 값으로 보유할 수 있습니다.

  • 기본 키로 사용할 수 없습니다

To-one 및 to-many 관계를 통해 하나 이상의 Realm 객체를 다른 Realm 객체에서 참조할 수도 있습니다. 자세한 내용은 관계 페이지를 참조하세요.

역링크는 RealmObject와 하나 이상의 RealmObject 또는 RealmObjectEmbeddedRealmObject 간의 역으로 된 to-many 관계를 나타냅니다. 역링크는 null일 수 없습니다.

역링크 구현:

자세한 내용은 역관계를 참조하세요.

EmbeddedRealmObjectRealmObject 의 특수 유형입니다.

EmbeddedRealmObject 속성:

  • 는 부모 객체 내에서 null이 가능한 객체여야 합니다.

  • 는 딕셔너리 내에서 null이 가능한 값이어야 합니다.

  • 목록 내에서 null을 허용하는 요소일 수 없습니다.

  • 기본 키로 사용할 수 없습니다

  • 비대칭 객체 내의 속성일 수 있습니다.

자세한 내용은 내장된 객체를 참조하세요.

버전 1.11.0의 새로운 기능.

Kotlin SDK는 다음 데이터 유형을 사용하여 지리적 공간 쿼리를 지원합니다:

중요

지리 공간적 데이터 유형을 지속할 수 없음

현재 지리 공간적 데이터 유형은 지속될 수 없습니다. 예를 들어 GeoBox 형식의 속성은 선언할 수 없습니다.

이러한 유형은 지리공간 쿼리의 인수로만 사용할 수 있습니다.

지리 공간적 데이터를 사용한 쿼리에 대한 자세한 내용은 지리 공간적 데이터를 참조하세요.

Kotlin SDK는 네이티브 환경에서 열거형 또는 열거 항목을 지원하지 않습니다. Realm 객체 클래스에서 열거형을 사용하려면 열거형의 기본 데이터 유형과 일치하는 유형으로 필드를 정의하세요.

그런 다음 필드에 대한 getter 및 setter를 만들어 필드 값을 기본 값과 열거형 형식 간에 변환합니다.

enum class EnumClass(var state: String) {
NOT_STARTED("NOT_STARTED"),
IN_PROGRESS("IN_PROGRESS"),
COMPLETE("COMPLETE")
}
class EnumObject : RealmObject {
var name: String? = null
private var state: String = EnumClass.NOT_STARTED.state
var stateEnum: EnumClass
get() = EnumClass.valueOf(state)
set(value) {
state = value.state
}
}

돌아가기

객체 모델 정의

이 페이지의 내용