2017-05-10 5 views
1

오늘 내 응용 프로그램 영역 스키마가 변경되었으므로 마이그레이션을 구현했습니다. 마이그레이션 내부 가, 난 그냥 필드를 추가하는 데 필요한, 그래서 내가 한 :RealmMigration이 내 영역의 모든 데이터를 지움

if (oldVersion == 0) { 
    RealmObjectSchema class = schema.get("Class"); 
    class.addField("addedField", boolean.class, null) 
     .transform(new RealmObjectSchema.Function() { 
      @Override 
      public void apply(DynamicRealmObject obj) { 
       obj.set("addedField", false); 
      } 
     }); 
     oldVersion++; 
} 

하지만 내 영역에서 모든 것을 삭제, 나는 더 많은 데이터를 가지고하지 않습니다.

아직 개발 단계에 있으므로 문제가되지 않습니다. RealmMigration을 구현하는 법을 배우기 위해 앱을 제거/재설치하는 대신 마이그레이션을 수행했습니다.

내가 잘못 했습니까? 나는 모든 것이 지워지는 것이 정상입니까? 좀 더 코드를 추가해야합니까? 이미 설명서를 읽고 샘플 앱을 살펴 보았습니다. 제공된 코드는 더 이상 얻지 못했습니다.

범주 구성 :

Realm.init(this); 
RealmConfiguration newConfig = new RealmConfiguration.Builder() 
    .name("myRealm.realm") 
    .schemaVersion(1) 
    .migration(new SchemaMigration()) 
    .build(); 

적어도 :

Realm realm = Realm.getInstance(newConfig); 

EDIT :

내가 name("myRealm.realm") 을 제거하여이를 해결했다. 처음 설치할 때 RealmConfiguration을 사용하지 않았으므로 영역의 이름은 "default.realm"이었습니다. 귀하의 지원과 답변에 감사드립니다.

+0

이주가 시도되기 전에. – EpicPandaForce

+0

아니요. 내가 설정의 코드와 함께 대답을 업데이 트합니다 –

답변

1

DynamicRealmObject의 변환을위한 필드 속성 사용 유형 특정 세터 (setBoolean)로 null를 통과하지 못한 시도 : 당신은 아마 deleteIfMigrationNeeded()가`체크하여 RealmConfiguration.Builder, 설정`이

if (oldVersion == 0) { 
    RealmObjectSchema class = schema.get("Class"); 
    class.addField("addedField", boolean.class) 
     .transform(new RealmObjectSchema.Function() { 
      @Override 
      public void apply(DynamicRealmObject obj) { 
      obj.setBoolean("addedField", false); 
     } 
    }); 
    oldVersion++; 
} 
+0

이 도움이되었지만, 문제는 이름과 관련 있다고 생각합니다. 첫 번째 설치에서는 RealmConfiguration을 사용하지 않았습니다. 그래서 영역의 이름은'default.realm'이었습니다. '.name ("myRealm.realm")'행을 삭제하고 작업을 완료하면 전체 이전 영역이 유지됩니다. 나는 속성으로 null을 제거하는 것이 좋은 지적이며,'setBoolean()'이 beetter이고 set()이 될 것이라고 생각하면서이 대답을 upvote 할 것이다. 고마워요! –

+0

@ 루카 니콜 레티, 환영합니다!) – Sergey