문서 메뉴
문서 홈
/ /
Atlas Device SDK
/ /

객체 모델 변경 - .NET SDK

이 페이지의 내용

  • 개요
  • 스키마 버전
  • 스키마 마이그레이션
  • 속성 추가
  • 속성 삭제
  • 속성 유형 수정 또는 속성 이름 변경
  • 마이그레이션 기능

마이그레이션 은 기존 영역과 해당 객체를 현재 Realm 스키마 버전 에서 최신 버전으로 변환합니다. 애플리케이션 데이터 모델은 일반적으로 새로운 요구 사항과 기능을 수용하기 위해 시간이 지남에 따라 변경됩니다. 마이그레이션을 사용하면 클라이언트 애플리케이션이 최신 버전으로 업그레이드될 때마다 기존 애플리케이션 데이터를 자동으로 업데이트할 수 있는 유연성을 확보할 수 있습니다.

"Person"이라는 RealmObject가 있는 다음 예시를 가정해 보겠습니다.

public partial class Person : IRealmObject
{
[PrimaryKey]
[MapTo("_id")]
public ObjectId Id { get; set; }
public string FullName { get; set; }
public int Age { get; set; }
}

이제 FullName 속성을 FirstNameLastName이라는 두 개의 개별 속성으로 분할한다고 가정해 보겠습니다.

public partial class Person : IRealmObject
{
[PrimaryKey]
[MapTo("_id")]
public ObjectId Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
}

이 시점에서 모델과 저장된 데이터가 일치하지 않으므로 영역을 열려고 할 때 예외가 발생합니다.

스키마 버전은 특정 시점의 Realm 스키마 상태를 식별합니다. Realm은 각 영역의 스키마 버전을 추적하고 이를 사용하여 각 영역의 객체를 올바른 스키마에 매핑합니다.

스키마 버전은 realm을 열 때 realm 구성에 포함할 수 있는 정수입니다. 클라이언트 애플리케이션이 realm을 열 때 버전을 지정하지 않으면 realm의 기본값은 버전 0 입니다.

중요

단조적 버전 증가

마이그레이션은 realm을 더 높은 스키마 버전으로 업데이트해야 합니다. 클라이언트 애플리케이션이 영역의 현재 버전보다 낮은 스키마 버전의 realm을 열거나 지정된 스키마 버전이 realm의 현재 버전과 동일하지만 다른 객체 스키마를 포함하는 경우 realm에서 오류가 발생합니다.

다음 예제는 스키마에서 속성을 추가, 삭제 및 수정하는 방법을 보여줍니다. 먼저 필요한 스키마를 변경합니다. 그런 다음 해당 마이그레이션 함수 를 생성하여 원본 스키마에서 업데이트된 스키마로 데이터를 이동합니다.

참고

동기화된 Realm의 스키마 속성 수정

다음 페이지에서는 로컬 영역의 스키마 속성을 수정하는 방법을 설명합니다. 동기화된 Realm의 스키마 속성을 수정하는 방법을 알아보세요.

참고

Realm 오픈 버전 업데이트

이 예제의 각 스키마 변경은 애플리케이션이 일정 시간 동안 각 버전을 사용한 후에 발생한다고 가정해 보겠습니다. 새 스키마 버전 번호는 업데이트된 스키마로 영역을 열고 새 버전 번호를 명시적으로 지정한 후에만 적용되므로 버전 3으로 이동하려면 먼저 버전 1과 2에서 앱을 열어야 합니다.

스키마 버전 1을(를) 사용하는 영역에는 Person 객체 유형이 있습니다.

public partial class Person : IRealmObject
{
[PrimaryKey]
[MapTo("_id")]
public ObjectId Id { get; set; }
public string FirstName { get; set; }
public int Age { get; set; }
}

다음 예에서는 원래 Person 스키마LastName 속성을 추가합니다.

public partial class Person : IRealmObject
{
[PrimaryKey]
[MapTo("_id")]
public ObjectId Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
}

다음 예제에서는 원래 Person 스키마에서 별도의 FirstNameLastName 속성 대신 결합된 FullName 속성을 사용합니다.

public partial class Person : IRealmObject
{
[PrimaryKey]
[MapTo("_id")]
public ObjectId Id { get; set; }
public string FullName { get; set; }
public int Age { get; set; }
}

다음 예에서는 원래 Person 스키마Age 속성을 수정하여 이름을 Birthday 로 바꾸고 유형을 DateTimeOffset 로 변경합니다.

public partial class Person : IRealmObject
{
[PrimaryKey]
[MapTo("_id")]
public ObjectId Id { get; set; }
public string FullName { get; set; }
public DateTimeOffset Birthday { get; set; }
}

개발 중 마이그레이션 우회

애플리케이션을 개발하거나 디버깅할 때는 마이그레이션하는 대신 영역을 삭제하는 것이 나을 수 있습니다. 스키마 불일치로 인해 마이그레이션을 수행해야 하는 경우, 데이터베이스를 자동으로 삭제하려면 ShouldDeleteIfMigrationNeeded 플래그를 사용하세요.

이 플래그를 true로 설정한 상태에서는 앱을 프로덕션에 배포하지 마세요.

업데이트된 스키마를 Person 준수하도록 Realm을 4 마이그레이션하려면 Realm의 스키마 버전 을 로 설정하고 FullName 기존 및 속성을 기반으로 값을 설정하는 마이그레이션 함수를 FirstName LastName 정의하고 를 Birthday 기준으로 한 의 값입니다.Age

1var config = new RealmConfiguration
2{
3 SchemaVersion = 4,
4 MigrationCallback = (migration, oldSchemaVersion) =>
5 {
6 var oldVersionPeople = migration.OldRealm.DynamicApi.All("Person");
7 var newVersionPeople = migration.NewRealm.All<Person>();
8
9 // Migrate Person objects
10 for (var i = 0; i < newVersionPeople.Count(); i++)
11 {
12 var oldVersionPerson = oldVersionPeople.ElementAt(i);
13 var newVersionPerson = newVersionPeople.ElementAt(i);
14
15 // Changes from version 1 to 2 (adding LastName) will
16 // occur automatically when Realm detects the change
17
18 // Migrate Person from version 2 to 3:
19 // Replace FirstName and LastName with FullName
20 // LastName doesn't exist in version 1
21 var firstName = oldVersionPerson.DynamicApi.Get<string>("FirstName");
22 var lastName = oldVersionPerson.DynamicApi.Get<string>("LastName");
23
24 if (oldSchemaVersion < 2)
25 {
26 newVersionPerson.FullName = firstName;
27 }
28 else if (oldSchemaVersion < 3)
29 {
30 newVersionPerson.FullName = $"{firstName} {lastName}";
31 }
32
33 // Migrate Person from version 3 to 4: replace Age with Birthday
34 if (oldSchemaVersion < 4)
35 {
36 var birthYear =
37 DateTimeOffset.UtcNow.Year - oldVersionPerson.DynamicApi.Get<int>("Age");
38 newVersionPerson.Birthday =
39 new DateTimeOffset(birthYear, 1, 1, 0, 0, 0, TimeSpan.Zero);
40 }
41 }
42 }
43};
44var realm = Realm.GetInstance(config);

돌아가기

관계

다음

데이터 바인딩