Realmを使う時、カラムを追加したり、変更すると、少し大変です。
ローカルで開発しているのであれば、アンインストールして、実行すれば問題ないですが、仮にリリースしていたら、Modelを変えるだけだと更新した際に起動できなくなります。
リリースしている場合に必要な実装を残したいと思います。
####①モデルの変更
open class Task: RealmObject() {
var id : Long = 0
var deleteflg: Int = 0
}
例えばですが、今回の場合は上記のdeleteflgを変えるので、下記のように変更します。
open class Task: RealmObject() {
var id : Long = 0
var isDelete: Int = 0
}
このように、カラム名を変更したり、追加したりを行います。
####②マイグレーションの変更
変更する前までは、特に必要がないですが、カラムを変更するとマイグレーションが必要になります。新しいスキーマであることを定義しないといけません。
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")
でカラム名を変更しています。
そのほかにはaddField
やremoveField
などがあるので、必要に応じて実装します。
####③マイグレーションの変更
Applicationを継承したクラスの頭で初期化しておくとどこからも使えて便利なので、そうしていたので、マイグレーションの設定を読み込むように追加しました。
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)