Realm

2016-02-03 6 views
2

У меня есть проблема с получением Realm успешно мигрировать и могли бы сделать с немного помочь будучи мастерить с ним в течение нескольких недель ..Realm

У меня есть область БД работает, с помощью которого я имею в виду сохранение данных и возврат данных.

Скажем, я хочу добавить новое поле «имя пользователя». Я обновляю свой код RealmObject, чтобы использовать новое поле. В моем App.java Затем я использую:

System.out.println("Configuring Realm..."); 
    RealmConfiguration config1 = new RealmConfiguration.Builder(this) 
      .schemaVersion(1) 
      .migration(new Migration()) 
      .build(); 
    realm = Realm.getInstance(config1); 
    realm.close(); 

Мои Migration.java выглядит следующим образом:

public class Migration implements RealmMigration { 
    @Override 
    public void migrate(DynamicRealm realm, long oldVersion, long newVersion) { 
     RealmSchema schema = realm.getSchema(); 
     RealmObjectSchema theSchema = schema.get("RealmStore"); 
     System.out.println("Realm version is " + oldVersion); 
     if (oldVersion == 0) { 
      theSchema 
        .addField("username", String.class); 
      oldVersion++; 
      System.out.println("Realm migrated from 0 to 1"); 
     } 
    } 
} 

я запустить приложение и следующий вывод Дано:

I/System.out: Configuring Realm... 
I/System.out: Realm version is 0 
I/System.out: Realm migrated from 0 to 1 

Все хорошо ! Кроме..! При повторном запуске приложения вы получаете следующую ошибку:

E/AndroidRuntime: FATAL EXCEPTION: main 
E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.rh.realmy/com.rh.realmy.Main}: java.lang.IllegalArgumentException: Realm on disk is newer than the one specified: v1 vs. v0 

Любые идеи?

+0

Это происходит, когда вы используете конфиг без специального 'schemaVersion' или нижайшего' schemaVersion', чем версия после миграции. Вы открываете Realm с другой конфигурацией? – beeender

+0

Привет, beeender, нет, никакой другой конфигурации – RJH

+0

Это действительно странно ... вы не можете поделиться своим проектом в частном порядке? Чтобы [email protected] – beeender

ответ

3

Проблема в том, что в других частях кода вы вызываете Realm.getInstance(context).

Это эквивалентно тому, выполнив следующие действия:

RealmConfiguration config = new RealmConfiguration.Builder(context).schemaVersion(0).build(); 
Realm realm = Realm.getInstance(config); 

Который даст вам ошибку несоответствия схемы вы видите.

Вы можете прочитать больше о конфигурации по умолчанию здесь: https://realm.io/docs/java/latest/#the-default-realm

+0

Благодарим за помощь – RJH

2

Кохи:

Это код, который я использовал в конце (который работает) ...

В моей App.java:

private Realm realm; 
@Override 
public void onCreate() { 
    super.onCreate(); 

    // Setup Realm 
    RealmConfiguration config1 = new RealmConfiguration.Builder(this) 
      .schemaVersion(0) 
      .migration(new Migration()) 
      .build(); 
    realm = Realm.getInstance(config1); // Automatically run migration if needed 
    Realm.setDefaultConfiguration(config1); 
    realm.close(); 
    } 
} 

В моем классе, который использует область:

private Realm realm; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
// Open the default Realm for the UI thread. 
    realm = Realm.getDefaultInstance(); 
} 

Затем используйте область по мере необходимости

Надеется, что это помогает

Смежные вопросы