객체 모델 변경 - Swift SDK
다음 예제에서는 스키마 에서 속성을 추가, 삭제 및 수정하는 방법을 보여 줍니다. 먼저 필요한 스키마 를 변경합니다. 그런 다음 스키마 버전을 증가시킵니다. 마지막으로 변경 사항이 손상적인(파괴적인) 경우 해당 마이그레이션 함수 를 생성하여 원본 스키마 에서 업데이트된 스키마 로 데이터를 이동합니다.
참고
Realm 오픈 버전 업데이트
다음 예시 에 표시된 각 스키마 변경은 애플리케이션 이 기존 스키마 를 사용한 후에 발생한다고 가정합니다. 새 스키마 버전 번호는 영역 을 열고 새 버전 번호를 명시적으로 지정한 후에만 적용 됩니다. 즉, 이전에 버전 0, 1 및 2 을 지정하고 사용하지 않고는 버전 3 을 지정할 수 없습니다.
스키마 버전 0
을(를) 사용하는 영역 에 Person
객체 유형이 있습니다.
public class Person extends RealmObject { // Realm schema version 0 public String firstName; public int age; }
class Person: RealmObject { // Realm schema version 0 var firstName: String = "" var age: int = 0 }
A. 속성 추가
다음 예에서는 원래 Person 스키마에 lastName
속성을 추가합니다.
public class Person extends RealmObject { // Realm schema version 1 public String firstName; public String lastName; public int age; }
class Person: RealmObject { // Realm schema version 1 var firstName: String = "" var lastName: String = "" var age: int = 0 }
B. 속성 삭제
다음 예제에서는 원래 Person 스키마에서 별도의 firstName
및 lastName
속성 대신 결합된 fullName
속성을 사용합니다.
public class Person extends RealmObject { // Realm schema version 2 public String fullName; public int age; }
class Person: RealmObject { // Realm schema version 2 var fullName: String = "" var age: int = 0 }
C. 속성 유형 수정 또는 속성 이름 바꾸기
다음 예시 에서는 원래 Person 스키마 의 age
속성 을 수정하여 이름을 birthday
로 바꾸고 유형을 Date
로 변경합니다.
public class Person extends RealmObject { // Realm schema version 3 public String fullName; public Date birthday = new Date(); }
class Person: RealmObject { // Realm schema version 3 var fullName: String = "" var birthday: Date = Date() }
D. 마이그레이션 기능
업데이트된 스키마를 Person
준수하도록 Realm을 마이그레이션하려면 Realm의 스키마 버전 을 3
로 설정하고 마이그레이션 함수를 정의하여 fullName
기존 firstName
lastName
및 속성을 기반으로 값을 설정하고 을 birthday
기준으로 한 의 값입니다.age
public class Migration implements RealmMigration { public void migrate(DynamicRealm realm, long oldVersion, long newVersion) { Long version = oldVersion; // DynamicRealm exposes an editable schema RealmSchema schema = realm.getSchema(); // Changes from version 0 to 1: Adding lastName. // All properties will be initialized with the default value "". if (version == 0L) { schema.get("Person") .addField("lastName", String.class, FieldAttribute.REQUIRED); version++; } // Changes from version 1 to 2: combine firstName/lastName into fullName if (version == 1L) { schema.get("Person") .addField("fullName", String.class, FieldAttribute.REQUIRED) .transform( DynamicRealmObject obj -> { String name = "${obj.getString("firstName")} ${obj.getString("lastName")}"; obj.setString("fullName", name); }) .removeField("firstName") .removeField("lastName"); version++; } // Changes from version 2 to 3: replace age with birthday if (version == 2L) { schema.get("Person") .addField("birthday", Date::class.java, FieldAttribute.REQUIRED) .transform(DynamicRealmObject obj -> { Int birthYear = Date().year - obj.getInt("age"); obj.setDate("birthday", Date(birthYear, 1, 1)); }) .removeField("age"); version++; } } }; public class Module {} RealmConfiguration config = new RealmConfiguration.Builder() .modules(new Module()) .schemaVersion(3) // Must be bumped when the schema changes .migration(new Migration()) // Migration to run instead of throwing an exception .build();
val migration = object: RealmMigration { override fun migrate(realm: DynamicRealm, oldVersion: Long, newVersion: Long) { var version: Long = oldVersion // DynamicRealm exposes an editable schema val schema: RealmSchema = realm.schema // Changes from version 0 to 1: Adding lastName. // All properties will be initialized with the default value "". if (version == 0L) { schema.get("Person")!! .addField("lastName", String::class.java, FieldAttribute.REQUIRED) version++ } // Changes from version 1 to 2: Combining firstName/lastName into fullName if (version == 1L) { schema.get("Person")!! .addField("fullName", String::class.java, FieldAttribute.REQUIRED) .transform { obj: DynamicRealmObject -> val name = "${obj.getString("firstName")} ${obj.getString("lastName")}" obj.setString("fullName", name) } .removeField("firstName") .removeField("lastName") version++ } // Changes from version 2 to 3: Replace age with birthday if (version == 2L) { schema.get("Person")!! .addField("birthday", Date::class.java, FieldAttribute.REQUIRED) .transform { obj: DynamicRealmObject -> var birthYear = Date().year - obj.getInt("age") obj.setDate("birthday", Date(birthYear, 1, 1)) } .removeField("age") version++ } } } class Module val config = RealmConfiguration.Builder() .schemaVersion(3) // Must be bumped when the schema changes .migration(migration) // Migration to run instead of throwing an exception .build()
애플리케이션의 백엔드 에 정의된 JSON schema 를 수정하여 동기화된 영역 의 스키마 를 변경할 수 있습니다. 동기화된 Realm은 동기화된 스키마에 대한 호환성이 손상되는 변경으로 인해 동기화 오류가 발생하므로 마이그레이션 기능이 필요하지 않습니다. 동기화는 동기화된 영역 스키마에 대한 호환성이 손상되지 않는 변경을 자동으로 처리합니다. 따라서 사용자가 애플리케이션을 업그레이드 할 때 이전 버전의 스키마 와 새 버전이 모두 동기화될 수 있습니다.
동기화된 영역의 스키마 변경 사항에 학습 보려면 동기화된 스키마 변경 사항을 참조하세요.
참고
개발 모드: 초기 스키마 정의 전용
백엔드 에서 클라이언트 모델을 로 자동 변환하는 개발 모드 를 사용하여 애플리케이션의 JSON schema 동기화된 스키마 의 첫 번째 버전을 정의할 수 있습니다. 그러나 이후에 앱에서 JSON schema 를 편집하여 스키마 를 변경해야 합니다.
팁
RealmConfiguration.shouldDeleteRealmIfMigrationNeeded() 빌더 메서드를 사용하여 마이그레이션 이 필요할 때 마이그레이션 을 수행하는 대신 영역 을 삭제 하기 위해 영역 을 구성할 수 있습니다. 이는 스키마가 자주 변경되는 개발 중에 유용할 수 있습니다.