Migration이란?
Realm은 모바일에 최적화된 데이터베이스 입니다.
기존에 Realm을 적용한 앱을 배포한 수 Realm의 데이터를 수정한 후 다시 앱을업데이트하게 되면
데이터베이스가 어떻게!?변경 되었는지를 알려줘야 합니다.
그렇지 않으면
io.realm.exceptions.RealmMigrationNeededException:
에러와 함께 실행중지가 됩니다.
이때 필요한게 바로 Migration입니다.
Realm Diary
데이터로 사용하는 Person객체가 있습니다.
PrimaryKey 인 id 와 이름(name), 성별(gender), 나이(age) 그리고 일기 리스트(diaries)
이렇게 5개의 정보를 가진 객체입니다.
1.Realm을 초기화 해주는 부분에서 schemaVersion설정
//Initialize Realm. Should only be done once when the application starts.
Realm.init(this);
RealmConfiguration config = new RealmConfiguration.Builder()
//.deleteRealmIfMigrationNeed()
.schemaVersion(1)
.build();
Realm.setDefaultConfiguration(config);
Realm을 초기화 해주는 부분에서 schemaVersion을 1로 적용해 줍니다.
데이터를 수정해 줄 때마다 이 schemaVersion을 한단계씩 높여야 됩니다.
2.Person 객체에 데이터를 추가해 보겠습니다.
job이라는 필드를 추가해 줬습니다.
이렇게 한 후 그대로 실행해 보면
io.realm.exceptions.RealmMigrationNeededException: Field count is less than expected - expected 6 but was 5
에러가 발생하며 앱이 죽게됩니다.
내용을 해석해 보면 RealmMigrationNeededException: 기존에 있는 Realm에서는 필드 개수가 5개여쓴ㄴ데
6개로(job이 추가 되었으니)기대 되어진다.
추가한 job필드를 Migration을 사용해 알려줘야 됩니다.
3.Migration추가하기
RealmConfiguration config = new RealmConfiguration.Builder()
.schemaVersion(2)
.migration(new RealmMigration(){
@Override
public void migrate(DynamicRealm realm, long oldVersion, long newVersion){
RealmSchema schema = realm.getSchema();
if(oldVersion == 1){
RealmObjectSchema mPersonSchema = schema.get("Person");
mPersonSchema.addField("job", String.class, null);
}
}
})
.build();
1)schemaVersion 1->2로 올려줍니다.
2)migration을 추가해 줍니다.
기존 앱에 있던 Realm의 schemaVersion이 업데이트 후의 schemaVersion과 다르면 최초 1회 migrate함수가 작동되고 그 뒤에는 작동되지 않습니다.
필드를 추가해 줄때에는
RealmObjectSchema mPersonSchema = schema.get("Person");
mPersonSchema.addField("job", String.class, null);
Person객체를 가진 스키마를 불러온 후 job필드를 추가해줍니다.
이 때 사용한 addField함수의 파라미터는 아래와 같습니다.
RealmObjectSchema addField(String fieldName, Class<?> fieldType, FieldAttribute... attributes)
필드이름, 필드타입, Attributes로 3가지 입니다.
-addField
스키마에 필드를 추가해 줄때 아래 이미지와 같이 여러개의 함수가 있습니다.
-Attributes
Attributes또한 아래 이미지와 같이 indexed, required, primary_key등 타입에 맞는 형식을 넣어주어야 하며
없는 경우 null을 입력해 주시면 됩니다.
그다음으로는 필드가 아닌 스키마를 새로 추가하는 법에 대해 살펴보겠습니다.
4.새로운 데이터 클래스 추가하기
DiaryDetail.class
public class Diarydetail extends RealmObject{
@Required
private String date;
@Required
private String title;
private String description;
private int number;
}
DiaryDetail은 4개의 데이터를 가지고 있습니다.
schema.create("DiaryDetail")
.addField("date", String.class, FieldAttribute.REQUIRED)
.addField("title", String.class, FieldAttribute.REQUIRED)
.addField("description", String.class)
.addField("number", int.class)
이때에는 create함수를 사용해 스키마를 추가해 줍니다.
*개발 단계에서는
Realm의 데이터가 달라질 때마다 Migration을 설정해 주기 매우 불편합니다.
Realm의 데이터가 달라지면 기존 데이터를 지우고 새로 만들어주는
deleteRealmIfMigrationNeed()
을 설정해 주시고 개발하시면 Migration설정 없이 편리하게 작업하실 수 있을겁니다.
참조 :
https://black-jin0427.tistory.com/98?category=727620
'안드로이드' 카테고리의 다른 글
STT(Speech-to-Text)란? (0) | 2022.11.09 |
---|---|
RxJava2을 사용한 Retrofit통신 (0) | 2022.11.04 |
[Android] Lottie 애니메이션 (0) | 2022.11.04 |
[Android] Di(Dependency Injection) Koin에 대해 알아보자 (0) | 2022.11.04 |
Android KeyStore (0) | 2022.11.04 |