모델 데이터 - Java SDK
객체 스키마 는 Realm 객체 유형의 필드와 관계를 정의하는 구성 객체입니다. Android Realm 애플리케이션은 Realm 스키마를 사용하는 Java 또는 Kotlin 클래스로 객체 스키마를 정의합니다.
객체 스키마는 각 필드의 데이터 유형 , 필드 필수 여부, 기본 필드 값과 같은 객체 필드에 대한 제약 조건을 지정합니다. 스키마는 Realm 객체 유형 간의 관계 를 정의할 수도 있습니다.
애플리케이션의 Realm 스키마를 수정하려면 이전 버전의 Realm 스키마에서 새 버전으로 데이터를 마이그레이션 해야 합니다.
Realm 앱
모든 앱에는 해당 애플리케이션의 Realm에 포함될 수 있는 각 객체 유형에 대한 객체 스키마 목록으로 구성된 Realm 스키마 가 있습니다.
Realm은 Realm의 모든 객체가 해당 객체 유형의 스키마를 준수하도록 보장하고 객체가 생성, 수정 또는 삭제될 때마다 객체의 유효성을 검사합니다.
Atlas Device Sync를 사용하는 앱은 두 가지 방법으로 스키마를 정의할 수 있습니다.
개발 모드 에서 Kotlin 및 Java클래스 선언을 사용하는 객체 스키마.
앱 백엔드의 JSON 객체 스키마 .
관계
RealmObject 필드를 사용하여 영역 에서 일대일 관계를 모델링할 수 있습니다. 일대다 및 다대일 관계 RealmList 필드를 모델링할 수 있습니다. 역관계는 일대다 또는 다대일 관계 의 반대편에 있습니다. RealmResults 필드 의 @LinkingObjects 주석을 사용하여 역관계 를 탐색 가능하게 만들 수 있습니다. RealmObject
인스턴스 에서 관계 필드에는 설명된 관계 를 통해 해당 객체 인스턴스 를 점 Realm 객체 설정하다 가 포함되어 있습니다. 수동 쿼리 로 동일한 Realm 객체 설정하다 를 찾을 수 있지만 관계 필드 는 상용구 쿼리 코드와 오류 용량 을 줄여줍니다.
RealmObject
자체 데이터를 포함하는 일반 Java 객체와 달리 Realm 객체에는 데이터가 포함되어 있지 않습니다. 대신 Realm 객체는 Realm에 직접 속성을 읽고 씁니다.
Realm 객체의 인스턴스는 managed 되거나 관리되지 않을 수 있습니다.
managed 객체는 다음과 같습니다.
Realm에서 지속
항상 최신 상태로 유지
스레드 제한
Java 힙에서 공간을 덜 차지하므로 일반적으로 관리되지 않는 버전보다 가볍습니다.
관리되지 않는 객체는 지속되지 않고 자동으로 업데이트되지 않는다는 점에서 일반 Java 객체와 같습니다. 관리되지 않는 객체를 스레드 간에 자유롭게 이동할 수 있습니다.
realm.copyToRealm() 메서드 를 사용하여 두 상태 간에 변환할 수 있습니다. 및 realm.copyFromRealm().
RealmProxy
RealmProxy
클래스는 Realm SDK가 Realm 객체에 데이터 자체가 포함되지 않도록 하는 방법입니다. 대신 각 클래스의 RealmProxy
가 데이터베이스의 데이터에 직접 액세스합니다.
프로젝트의 모든 모델 클래스에 대해 Realm 주석 프로세서는 해당 RealmProxy
클래스를 생성합니다. 이 클래스는 모델 클래스를 확장하며 Realm.createObject()
를 호출할 때 반환됩니다. 코드에서 이 객체는 모델 클래스처럼 작동합니다.
Realm 객체 제한
Realm 객체:
final
또는volatile
수정자를 사용하는 필드를 포함할 수 없습니다( 역관계 필드 제외).RealmObject
이외의 객체를 확장할 수 없습니다.빈 생성자를 포함해야 합니다(클래스에 생성자가 포함되어 있지 않은 경우 자동으로 생성된 빈 생성자로 충분합니다).
이름 지정 제한 사항:
클래스 이름은 57자를 초과할 수 없습니다.
클래스 이름은 영역 모듈내에서 고유해야 합니다.
필드 이름은 63자를 초과할 수 없습니다.
크기 제한:
String
또는byte[]
필드는 16MB를 초과할 수 없습니다.
사용 제한 사항:
Realm 객체는 활성 상태이며 언제든지 변경될 수 있으므로
hashCode()
값은 시간이 지남에 따라 변경될 수 있습니다. 따라서 어떤 맵이나 세트에서든RealmObject
인스턴스를 키로 사용해서는 안 됩니다.
증분 빌드
Realm에서 사용하는 바이트코드 변환기는 증분 빌드를 지원하지만 Realm 객체 필드에서 다음을 추가하거나 제거할 때는 애플리케이션에서 전체를 다시 빌드해야 합니다.
@Ignore
주석static
키워드transient
키워드
이러한 경우 Build > Clean Project 및 Build > Rebuild Project 을(를) 사용하여 전체 리빌드를 수행할 수 있습니다.
스키마 버전
스키마 버전은 특정 시점의 Realm 스키마 상태를 식별합니다. Realm은 각 realm의 스키마 버전을 추적하고 이를 사용하여 각 realm의 객체를 올바른 스키마에 매핑합니다.
스키마 버전은 realm을 열 때 realm 구성에 포함할 수 있는 정수입니다. 클라이언트 애플리케이션이 realm을 열 때 버전을 지정하지 않으면 realm의 기본값은 버전 0
입니다.
중요
단조적 버전 증가
마이그레이션 은 영역을 상위 스키마 버전으로 업데이트해야 합니다. 클라이언트 애플리케이션이 Realm의 현재 버전보다 낮은 스키마 버전의 영역을 열거나 지정된 스키마 버전이 Realm의 현재 버전과 동일하지만 다른 객체 스키마를 포함하는 경우 Realm에서 오류가 발생합니다.
마이그레이션
로컬 마이그레이션 은 다른 Realm과 자동으로 동기화 되지 않는 Realm에 대한 마이그레이션입니다. 로컬 마이그레이션은 기존 Realm 스키마, 버전 및 객체에 액세스할 수 있으며 Realm을 새 스키마 버전으로 점진적으로 업데이트하는 로직을 정의합니다. 로컬 마이그레이션을 수행하려면 현재 버전보다 높은 새 스키마 버전을 지정하고 오래된 Realm을 열 때 마이그레이션 기능을 제공해야 합니다.
SDK를 사용하면 수동 마이그레이션을 통해 스키마 변경 사항을 반영하도록 기본 데이터를 업데이트할 수 있습니다. 이러한 수동 마이그레이션 중에 스키마에 추가되거나 제거될 때 새 속성과 삭제된 속성을 정의할 수 있습니다. DynamicRealm 을 통해 노출된 편집 가능한 스키마는 필드 이름을 바꿀 수 있는 편의 기능을 제공합니다. 이를 통해 복잡한 스키마 마이그레이션 중에 데이터 동작을 완전히 제어할 수 있습니다.
팁
애플리케이션 개발 중 마이그레이션
애플리케이션 개발 중에 RealmObject
클래스가 자주 변경될 수 있습니다. Realm.deleteRealm() 을 사용하여 데이터베이스 파일을 삭제하면 데이터 테스트를 위해 전체 마이그레이션을 작성할 필요가 없습니다.