RealmのModelクラスを変更する際、端末内に古いModelクラスのデータが残っている状態でアプリをビルドすると、以下のようなエラーでクラッシュします。
エラー内容
Caused by: io.realm.exceptions.RealmMigrationNeededException: Migration is required due to the following errors:
これは、端末内の古いModelクラスで保存された内容と新しいModelクラスの整合性が取れないことが原因で発生します。
対処方法は以下の3つです。
①端末のアプリを削除後、インストールする
②.Realmファイルを削除する
③マイグレーションを行う
アプリ開発中でModelクラスを何度も変更する場合は1と2が手っ取り早くておすすめです。
公開したアプリがあって、そこのModelクラスを変更したい場合は3を行う必要があります。
①端末のアプリを削除する
簡単にできます。
端末内に保存されているデータが古いことが原因なので、アプリを削除して再度インストールすることで解決します。
②.Realmファイルを削除する
以下の deleteRealmIfMigrationNeeded() を追加することで、Modelクラスが変更された場合、マイグレーションの代わりに.Realmファイルを削除してくれます。
RealmConfiguration config = new RealmConfiguration.Builder() .deleteRealmIfMigrationNeeded() .build()
Modelクラスを変更して端末内のデータと整合性がとれなくなったときにデータが削除されるので、開発中に使用するのがいいと思います。(公開しているアプリでやるとデータが急に消えてしまって大変・・・)
③マイグレーションを行う
RealmMigrationクラスを継承したクラスを作成し、マイグレーションする。
class Migration: RealmMigration { override fun migrate(realm: DynamicRealm, oldVersion: Long, newVersion: Long) { val realmSchema = realm.schema var oldVersion = oldVersion // こんな感じでマイグレーションする(MemoTypeクラスにString?型の"category"を追加した場合) if (oldVersion == 0L) { val userSchema = realmSchema.get("MemoType") userSchema!!.addField("category", String::class.java) oldVersion++ } } }
.schemaVersion([バージョン]).migration(Migration()) を追加する。
バージョンはModelクラスを変更するたびにインクリメントして設定する。
val config = RealmConfiguration.Builder() .schemaVersion(1L).migration(Migration()).build() Realm.setDefaultConfiguration(config)
これで、Molelクラスを変更してもクラッシュせず、端末内データを保持できます!
コメントを残す