【Android & Kotlin】Realmのマイグレーション

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クラスを変更してもクラッシュせず、端末内データを保持できます!


投稿日

カテゴリー:

投稿者:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA