web-dev-qa-db-ja.com

レルムモデルを変更するときのRealmMigrationNeededException

フィールドを追加するなどしてモデルを変更すると、アプリがio.realm.exceptions.RealmMigrationNeededExceptionエラーでクラッシュします。これは、アプリをアンインストールして再インストールした場合にのみ解決できます。

移行を行うための提案はありますか?デフォルトのインスタンスのみを使用しています。

7
Ralphilius

ここで必要な情報を見つけることができるはずです:

https://realm.io/docs/Java/latest/#migrations

古いデータベーススキーマの下でディスクにデータが保存されていない場合は、コードを新しい定義に変更するだけで問題なく機能します。ただし、そうすると、Realmがコードで定義したものと、Realmがディスク上で認識するデータとの間に不一致が生じるため、例外がスローされます。

11
Broak

古いデータを失うことに問題がない場合は、レルム構成を削除して新しいデータを作成できます。

Realm realm = null;

                    try {
                       realm = Realm.getInstance(MainActivity.this);
                    } catch (RealmMigrationNeededException r) {
                        Realm.deleteRealmFile(MainActivity.this);
                        realm = Realm.getInstance(MainActivity.this);
                    }

OR

RealmConfiguration config2 = new RealmConfiguration.Builder(this)
                .name("default2") 
                .schemaVersion(3) 
                .deleteRealmIfMigrationNeeded() 
                .build(); 


        realm = Realm.getInstance(config2);

データを失いたくない場合は、Migrationを実行する必要があります。この例を参照してください ここ

16
AZ_

0.84.2でのレルムの移行はかなり変更されています。レルム(0.84.2)の移行を機能させるための重要なポイントは、次のことを理解することでした。

  • アプリにschemaVersionを指定せずにレルムデータベースがある場合、schemaVersionは常に0です。移行が必要になり、アプリのライブリリースをすでに実行している場合は、構成でschemaVersionの使用を開始する可能性があるため、これはほとんどの場合に当てはまります。

  • SchemaVersionは自動的に保存され、アプリの新規インストールが発生し、すでにschemaVersion 3を使用している場合、レルムは例外があるかどうかを自動的にチェックします。例外がない場合は、schemaVersionを3に設定して、不要なときに移行が実行されないようにします。これは、SharedPreferencesに何も保存する必要がないことも意味します。

  • 移行では、型がnull許容でない場合、新しい列のすべての値を設定する必要があります...

  • 空の文字列を挿入できますが、列にconvertColumnToNullableを設定する場合に限ります

2
Jordy