2016-12-13 3 views
1

レルムスキーマを更新するときに、新しいクラス/フィールドを追加するようにRealmMigrationを再設定しました。私はアプリを更新しても何の問題もありませんでしたが、バージョンが変更されたことを指定せずにレルムが自分のスキーマを更新したことがわかったため、スキーマバージョンを更新するのを忘れてしまいました。スキーマのバージョンが変更されていなくても、レルムが移行されたスキーマ

私はそれを更新したときにクラスが既に存在していますが、これはさらに混乱していました。今は自分のスキーマバージョンを設定することを知らなかったので、私はスキーマを変更しました。 RealmMigrationオブジェクトなので、以前のバージョン番号に残しておくべきかどうかはわかりませんでした。クラスはまだ存在しません。例外が発生しているか、正しいバージョン番号に変更して例外を引き起こします。

レルム移行例外が発生した場合、指定されたRealmMigrationオブジェクトでレルムがマイグレーションを実行できる可能性があります。スキーマのバージョンが決して更新されなかったとしても?

RealmMigration migration = new RealmMigration() { 
    @Override 
    public void migrate(DynamicRealm realm, long oldVersion, long newVersion) { 
     RealmSchema schema = realm.getSchema(); 
     if (oldVersion == 0) { 
      schema.create("Person") 
       .addField("name", String.class) 
       .addField("age", int.class); 
      // forgot: oldVersion++; 
     } 
    } 
} 

あなたがPersonクラスを追加したり、バージョンをバンプすべきかどうかを判断するためにバージョンを使用することはできません。

答えて

1

は、私はあなたの移行コードがあると仮定しましょう。しかし、あなたはPersonが存在するかどうか知っていることを使用することができます、あなたはバージョンをバンプする必要があります。

RealmMigration migration = new RealmMigration() { 
    @Override 
    public void migrate(DynamicRealm realm, long oldVersion, long newVersion) { 
     RealmSchema schema = realm.getSchema(); 
     if (oldVersion == 0) { 
      if (schema.contains("Person)) { 
       oldVersion++; 
      } else { 
       schema.create("Person") 
        .addField("name", String.class) 
        .addField("age", int.class); 
       oldVersion++; 
      } 
     } 
    } 
} 
+0

これは、スキーマのバージョンが変更されていなくても、レルムがスキーマを更新することを意図していますか? – shoe

+0

そのためのものではありません。ユースケースとはみなしませんでした。 – geisshirt

0

データベースの変更を忘れた場合、レルムの移行が開始されず、データベースが破損することはありません。実際のバージョン(つまり、前のバージョン - 1、実際のバージョン - 2)を書き込むだけで、適切な移行スクリプトが自動的に開始されます。

関連する問題