10
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Realmのマイグレーションをやってみた

Last updated at Posted at 2019-05-13

Realmを使う時、カラムを追加したり、変更すると、少し大変です。
ローカルで開発しているのであれば、アンインストールして、実行すれば問題ないですが、仮にリリースしていたら、Modelを変えるだけだと更新した際に起動できなくなります。

リリースしている場合に必要な実装を残したいと思います。

####①モデルの変更

Task.kt
open class Task: RealmObject() {
    var id : Long = 0
    var deleteflg: Int = 0
}

例えばですが、今回の場合は上記のdeleteflgを変えるので、下記のように変更します。

Task.kt
open class Task: RealmObject() {
    var id : Long = 0
    var isDelete: Int = 0
}

このように、カラム名を変更したり、追加したりを行います。

####②マイグレーションの変更

変更する前までは、特に必要がないですが、カラムを変更するとマイグレーションが必要になります。新しいスキーマであることを定義しないといけません。

Migration.kt
class Migration : RealmMigration {

    override  fun migrate(realm: DynamicRealm, oldVersion: Long, newVersion: Long) {
        val realmSchema = realm.schema
        var oldVersion = oldVersion

        if (oldVersion == 0L) {
            val userSchema = realmSchema.get("Task")
            userSchema!!.renameField("deleteFlg", "isDelete")
            oldVersion++
        }
    }
}

oldVersionが今までのスキーマのバージョンで今回+1します。
スキーマを取得して、userSchema!!.renameField("deleteFlg", "isDelete")でカラム名を変更しています。
そのほかにはaddFieldremoveFieldなどがあるので、必要に応じて実装します。

####③マイグレーションの変更
Applicationを継承したクラスの頭で初期化しておくとどこからも使えて便利なので、そうしていたので、マイグレーションの設定を読み込むように追加しました。

TaskSchedulerApplication.kt
class TaskSchedulerApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        Realm.init(this)
        val builder = RealmConfiguration.Builder()
        builder.schemaVersion(1L).migration(Migration())
        val config = builder.build()
        Realm.setDefaultConfiguration(config)
    }
}

Migrationクラスの設定を呼び出し、新しいバージョンスキーマでRealmを使うように設定します。
新しい定義や構成をRealmに設定します。

これらの手順でアプリを更新しても新しいModelを読み取ってくれるので、アプリは起動できます。
ただ、データの中身を変えないといけない場合は、さらに大変だと思います。

####参照
[RealmObjectSchema]
(https://realm.io/docs/java/latest/api/io/realm/RealmObjectSchema.html)
[公式ドキュメント]
(https://realm.io/jp/docs/java/latest/#%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)
[RealmConfiguration]
(https://realm.io/docs/java/latest/api/io/realm/RealmConfiguration.html)

10
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?