Docs Menu
Docs Home
/ /
Atlas Device SDK
/ / /

속성 주석 - Kotlin SDK

이 페이지의 내용

  • 프라이머리 키 설정
  • 속성 또는 클래스를 다른 이름에 매핑
  • Realm 스키마에서 속성 무시
  • 색인 속성
  • 전체 텍스트 검색 인덱스

이 페이지에서는 객체 모델에서 속성의 동작을 사용자 지정하는 데 사용할 수 있는 주석에 대해 설명합니다. 객체 모델을 정의하는 방법에 대한 자세한 내용은 Realm 객체 모델 정의 - Kotlin SDK를 참조하세요.

코틀린 SDK ( 코틀린 SDK (Kotlin SDK) )는 Realm 객체 속성에 기능을 추가하는 몇 가지 속성 주석 을 제공합니다. 주석 API 참조도 참조하세요.

참고

속성 선언

Kotlin에서 값 유형은 암시적으로 null을 허용하지 않습니다. 기본 제공 ? Kotlin 연산자를 사용하여 속성을 선택적(null 가능)으로 선언할 수 있습니다. 또는 속성 선언에서 속성에 기본값을 할당할 수 있습니다. 예시는 지원되는 데이터 유형 목록을 참조하세요.

이 페이지의 예시는 다음 Frog 클래스를 참조합니다:

class Frog : RealmObject {
@PrimaryKey
var _id: ObjectId = ObjectId() // Primary key property
@Index
var name: String = "" // Indexed property
@Ignore
var age: Int = 0 // Ignored property
@PersistedName("latin_name")
var species: String? = null // Remapped property
@FullText
var physicalDescription: String? = null // Full-text search indexed property
}

프라이머리 키는 영역에 있는 객체의 고유 식별자입니다. 동일한 유형의 다른 객체는 객체의 프라이머리 키를 공유할 수 없습니다.

속성을 객체 유형의 프라이머리 키로 지정하려면 @PrimaryKey 주석을 사용합니다:

@PrimaryKey
var _id: ObjectId = ObjectId() // Primary key property

기본 키의 중요한 측면:

  • 객체 모델당 기본 키는 하나만 정의할 수 있습니다.

  • 영역에 해당 유형의 객체를 추가한 후에는 객체 유형의 프라이머리 키 필드를 변경할 수 없습니다.

  • 프라이머리 키 값은 영역에 있는 객체의 모든 인스턴스에서 고유해야 합니다. 중복된 프라이머리 키 값을 삽입하려고 하면 오류가 발생합니다.

  • 프라이머리 키 값은 변경되지 않습니다. 객체의 프라이머리 키 값을 변경하려면 원본 객체를 삭제하고 프라이머리 키 값이 다른 새 객체를 삽입해야 합니다.

  • 프라이머리 키는 null 값을 허용합니다. 프라이머리 키 값은 고유해야 하므로 null은 컬렉션에 있는 한 객체의 프라이머리 키에만 사용할 수 있습니다.

  • Realm은 자동으로 프라이머리 키를 인덱싱하기 때문에 프라이머리 키를 기반으로 객체를 효율적으로 읽고 수정할 수 있습니다.

다음 유형 중 하나를 사용하여 기본 키를 만들 수 있습니다:

  • String

  • Byte

  • Char

  • Short

  • Int

  • Long

  • ObjectId

  • RealmUUID

중요

Device Sync에 _id 프라이머리 키 필드 필수

Device Sync를 사용하는 경우 객체 모델에 _id로 명명된 프라이머리 키 필드가 반드시 포함되어야 하며, 이 필드의 유형은 String, Int 또는 ObjectId이어야 합니다.

자세한 내용은 Device Sync를 통한 데이터 모델 - Kotlin SDK를 참조하세요.

버전 10.8.0의 새로운 기능: 클래스 이름을 @PersistedName으로 다시 매핑하기

기본적으로 영역은 모델 클래스에 정의된 이름을 사용하여 내부적으로 클래스와 필드를 나타냅니다. Kotlin SDK를 사용하면 속성 또는 클래스 이름을 코드에 사용된 이름과 다른 영구적인 이름으로 매핑할 수 있습니다. 다음과 같은 경우에는 영역에 다른 이름을 유지하는 것이 유용합니다.

  • 명명 규칙이 서로 다른 플랫폼에서 더 쉽게 작업할 수 있습니다. 예를 들면 Device Sync 스키마 속성 이름은 스네이크 표기법을 사용하고, 프로젝트는 카멜 표기법을 사용하는 경우입니다.

  • 마이그레이션을 강제하지 않고 Kotlin에서 클래스 또는 필드 이름을 변경합니다.

  • 서로 다른 패키지에서 동일한 단순한 이름을 가진 여러 모델 클래스를 지원하고자 하는 경우.

  • 클래스 이름이 Realm에서 지정한 57자 제한보다 긴 경우.

코드의 Kotlin 클래스 또는 속성 이름을 다른 이름으로 매핑하여 영역에 유지하려면 다음 안내를 따르세요.

  1. Kotlin 클래스 또는 속성에 @PersistedName 주석을 사용하세요.

  2. 영역에 유지하려는 클래스 또는 속성 name 을 지정합니다.

이 예시에서 Frog은(는) 프로젝트 전체 코드에서 CRUD 작업을 수행하는 데 사용되는 Kotlin 클래스 이름이고, Frog_Entity은(는) 영역에 객체를 저장하는 데 사용되는 지속형 이름입니다.

@PersistedName(name = "Frog_Entity") // Remapped class name
class Frog : RealmObject {
@PrimaryKey
var _id: ObjectId = ObjectId()
var name: String = ""
var age: Int = 0
var species: String? = null
var owner: String? = null
}

중요

재매핑된 클래스 이름으로 쿼리

다시 매핑된 클래스 이름을 가진 객체에 대해 역관계를 쿼리할 때는 지속형 클래스 이름을 사용해야 합니다. 위의 예에서는 Frog 대신 Frog_Entity을(를) 쿼리해야 합니다. 자세한 내용은 역관계 쿼리를 참조하세요.

이 예시에서 species 은(는) 프로젝트 전체의 코드에서 CRUD 작업을 수행하는 데 사용되는 Kotlin 속성 이름이고, latin_name 은 영역에 값을 저장하는 데 사용되는 영구 이름입니다.

@PersistedName("latin_name")
var species: String? = null // Remapped property

다시 매핑된 속성 이름으로 쿼리하기

코드에 사용된 Kotlin 이름과 Realm에 저장된 영구 이름으로 쿼리할 수 있습니다. 자세한 내용은 다음을 참조하세요.

동기화된 영역에 쓰는 경우 Sync 스키마는 영구 클래스 또는 속성 이름을 사용하여 저장된 값을 확인합니다. 다음 사항에 유의하세요:

  • 마이그레이션은 반드시 영구 클래스 또는 속성 이름을 사용해야 합니다.

  • 보고된 스키마 오류는 영구적인(persisted) 이름을 사용합니다.

기본적으로 Realm은 Realm 객체 모델에 정의된 속성을 관리합니다. 그러나 영역에 유지하지 않으려는 속성을 무시하도록 선택할 수 있습니다.

속성을 무시하고 해당 속성이 영역에 지속되지 않도록 하려면 @Ignore 주석을 사용합니다:

@Ignore
var age: Int = 0 // Ignored property

무시된 속성은 데이터베이스에 저장되지 않고 쿼리에 사용할 수 없으며 Realm 알림을 트리거하지 않습니다. 이 점을 제외하면 관리 속성과 똑같이 동작합니다. 클래스 내에서 괸리되는 속성과 무시되는 속성을 혼합할 수 있습니다.

인덱스는 영역 데이터의 일부를 탐색하기 쉬운 형식으로 저장하는 특수 데이터 구조입니다. 인덱스는 영역에서 보다 효율적인 쿼리 실행을 지원합니다. 쿼리에 적합한 인덱스가 있으면 영역은 인덱스를 사용하여 검사해야 하는 문서 수를 제한합니다. 그렇지 않으면 영역은 컬렉션의 모든 문서를 스캔하고 쿼리와 일치하는 문서를 선택해야 합니다.

인덱스는 필드 값에 따라 정렬된 특정 필드의 값을 저장합니다. 인덱스 항목의 순서는 효율적인 동등성 매치 및 범위 기반 쿼리 작업을 지원합니다. 인덱스를 사용하면 일부 쿼리 속도가 빨라지지만 쓰기 속도가 약간 느려지기도 합니다. 추가 저장 공간과 메모리 오버헤드가 제공됩니다. Realm은 인덱스를 디스크에 저장하므로 영역 파일이 더 커집니다. 각 인덱스 항목은 최소 12 바이트입니다.

속성에 인덱스를 만들려면 속성에서 @Index 주석을 사용합니다:

@Index
var name: String = "" // Indexed property

참고

프라이머리 키는 기본적으로 인덱싱됩니다.

다음 유형의 필드를 인덱싱할 수 있습니다:

  • String

  • Byte

  • Short

  • Int

  • Long

  • Boolean

  • RealmInstant

  • ObjectId

  • RealmUUID

동일한 속성에서 표준 인덱스를 전체 텍스트 FTS(Atlas Search) 인덱스와 결합 할 수 없습니다 . 속성에 FTS 인덱스를 만들려면 전체 텍스트 Atlas Search 인덱스 섹션을 참조하세요.

Realm은 표준 인덱스 외에도 String 속성에 대한 FTS(Full-Text Search) 인덱스를 지원합니다. 표준 인덱스 유무에 관계없이 문자열 필드를 쿼리할 수 있지만 FTS 인덱스를 사용하면 여러 단어와 구문를 검색하고 나머지는 제외할 수 있습니다.

속성에 FTS 인덱스를 만들려면 @FullText 주석을 사용하세요:

@FullText
var physicalDescription: String? = null // Full-text search indexed property

FTS 인덱스에 대한 다음 제약 조건에 유의하세요:

  • String 유형의 속성에 대해서만 FTS 인덱스를 만들 수 있습니다.

  • 동일한 속성에서 FTS 인덱스와 표준 인덱스를 결합 할 수 없습니다 . 속성에 대한 표준 인덱스를 만들려면 인덱스 속성 섹션을 참조하세요.

참고

전체 텍스트 검색 인덱스에 대한 글자 수 제한

전체 텍스트 검색(FTS) 인덱스의 경우 ASCII 및 라틴-1 영숫자 문자(대부분의 서양 언어)만 인덱스에 포함됩니다.

인덱스는 발음 부호 및 대소문자를 구분하지 않습니다.

전체 텍스트 인덱스 쿼리에 대한 자세한 내용은 Full Text Search(FTS) 속성으로 필터링을 참조하세요.

돌아가기

지원되는 데이터 유형