フィールドを追加するなどしてモデルを変更すると、アプリがio.realm.exceptions.RealmMigrationNeededExceptionエラーでクラッシュします。これは、アプリをアンインストールして再インストールした場合にのみ解決できます。
移行を行うための提案はありますか?デフォルトのインスタンスのみを使用しています。
ここで必要な情報を見つけることができるはずです:
https://realm.io/docs/Java/latest/#migrations
古いデータベーススキーマの下でディスクにデータが保存されていない場合は、コードを新しい定義に変更するだけで問題なく機能します。ただし、そうすると、Realmがコードで定義したものと、Realmがディスク上で認識するデータとの間に不一致が生じるため、例外がスローされます。
古いデータを失うことに問題がない場合は、レルム構成を削除して新しいデータを作成できます。
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
を実行する必要があります。この例を参照してください ここ 。
0.84.2でのレルムの移行はかなり変更されています。レルム(0.84.2)の移行を機能させるための重要なポイントは、次のことを理解することでした。
アプリにschemaVersionを指定せずにレルムデータベースがある場合、schemaVersionは常に0です。移行が必要になり、アプリのライブリリースをすでに実行している場合は、構成でschemaVersionの使用を開始する可能性があるため、これはほとんどの場合に当てはまります。
SchemaVersionは自動的に保存され、アプリの新規インストールが発生し、すでにschemaVersion 3を使用している場合、レルムは例外があるかどうかを自動的にチェックします。例外がない場合は、schemaVersionを3に設定して、不要なときに移行が実行されないようにします。これは、SharedPreferencesに何も保存する必要がないことも意味します。
移行では、型がnull許容でない場合、新しい列のすべての値を設定する必要があります...
空の文字列を挿入できますが、列にconvertColumnToNullableを設定する場合に限ります