2017-02-10 16 views
0

Я новичок в android, и я использовал realm в своем APP, но я не указал схему, тогда, когда я хочу обновить приложение и реализовать миграцию.Android: Realm Migration Issue

Раньше я делал это,

Realm.init(getApplicationContext()); 

RealmConfiguration realmConfiguration = 
         new RealmConfiguration.Builder().build(); 

realm = Realm.getInstance(realmConfiguration); 

И теперь,

Realm.init(getApplicationContext()); 

RealmConfiguration realmConfiguration = 
          new RealmConfiguration.Builder().schemaVersion(1).migration(new Migration()).build(); 

realm = Realm.getInstance(realmConfiguration); 

И, я получаю эту ошибку.

java.lang.IllegalArgumentException: Configurations cannot be different if used to open the same file. 
Cached configuration: 
realmDirectory: /data/user/0/in.avanti_app.student_companion.debug/files 
realmFileName : default.realm 
canonicalPath: /data/data/in.avanti_app.student_companion.debug/files/default.realm 
key: [length: 0] 
schemaVersion: 1 
migration: [email protected] 
deleteRealmIfMigrationNeeded: false 
durability: FULL 
schemaMediator: [email protected] 

New configuration: 
realmDirectory: /data/user/0/in.avanti_app.student_companion.debug/files 
realmFileName : default.realm 
canonicalPath: /data/data/in.avanti_app.student_companion.debug/files/default.realm 
key: [length: 0] 
schemaVersion: 0 
migration: null 
deleteRealmIfMigrationNeeded: false 
durability: FULL 
schemaMediator: [email protected] 

Я также переопределяю hasCode и равен в классе миграции.

+0

'Я также переопределяю hasCode и равен в классе миграции.' Пожалуйста, покажите соответствующий код – EpicPandaForce

+0

Хотя кажется, что у вас есть конфигурация с 'schemaVersion1' и' schemaVersion0'. – EpicPandaForce

+0

@EpicPandaForce public class Migration реализует RealmMigration { Overirde public int hashCode() { return Migration.class.hashCode(); } Overirde public boolean equals (Object o) { return (o instanceof Migration); } Overirde общественного недействительными мигрирует (конечная DynamicRealm область, длинные oldVersion, длинные newVersion) {// миграция логика }} –

ответ

0

Вызов Realm.init(Context) инициализирует «Конфигурация по умолчанию» в следующем коде

public static synchronized void init(Context context) { 
    if (BaseRealm.applicationContext == null) { 
     if (context == null) { 
      throw new IllegalArgumentException("Non-null context required."); 
     } 
     RealmCore.loadLibrary(context); 
     defaultConfiguration = new RealmConfiguration.Builder(context).build(); 
     ObjectServerFacade.getSyncFacadeIfPossible().init(context); 
     BaseRealm.applicationContext = context.getApplicationContext(); 
     SharedRealm.initialize(new File(context.getFilesDir(), ".realm.temp")); 
    } 
} 

Но new RealmConfiguration.Builder(context).build(); задает конфигурацию без версии схемы, миграции, deleteIfMigrationNeeded() и т.д.

Для того, чтобы установить новую конфигурацию по умолчанию, вам необходимо создать свою конфигурацию, а затем позвонить по телефону Realm.setDefaultConfiguration(realmConfig);


RealmConfiguration realmConfiguration = 
     new RealmConfiguration.Builder().schemaVersion(1).migration(new Migration()).build(); 
Realm.setDefaultConfiguration(realmConfiguration); 
realm = Realm.getDefaultInstance();