はじめに
Android の Realm のマイグレーションのサンプルコードを見ると、
The API for migration is currently using internal lower level classes that will be replaced by a new API very soon! Until then you will have to explore and use below example as inspiration.
なんて記述があり、まだまだマイグレーションの API が荒削りなのが現状です。
で、実際にマイグレーションを考えた時に、バージョンの問題にぶつかったのでその時のメモです。
同じ問題に悩んでいる方、これから導入を考えている方などの参考になれば幸いです。
マイグレーション手順
詳細な手順については、サンプルコードを見ていただければわかると思うので割愛します。
下記コードはサンプルコードの抜粋です。マイグレーションは Realm のバージョンを見て、必要な処理を段階的に実行し、最新化するという流れです。
public class Migration implements RealmMigration {
@Override
public long execute(Realm realm, long version) {
// Migrate from version 0 to version 1
if (version == 0) {
// マイグレーション処理
version++;
}
// Migrate from version 1 to version 2
if (version == 1) {
// マイグレーション処理
version++;
}
return version;
}
}
問題点
スキーマが進化しつづけようと、インストール時などの初回セットアップ時にはバージョンが 0 となります。そのため、適切なバージョンにアップデートしてあげないといけないのですが、その方法が用意されていません。
対応方法
初回起動時、Realm のファイルの存在チェックをして、ファイル生成後に以下のマイグレーションコードを実行してあげれば OK です!
Realm.migrateRealmAtPath(file.getAbsolutePath(), new RealmMigration() {
@Override
public long execute(Realm realm, long version) {
return 2; // 現在のスキーマのバージョンをセットする
}
});
中の人の回答なので、これがいい方法なのかなと思います。
https://github.com/realm/realm-java/issues/886
マイグレーションの API は、現在 v2 を開発中のようなので、動向が気になる方は、以下をチェックするといいと思います。
https://github.com/realm/realm-java/pull/880
おわりに
公式 Twitter のメッセージ、GitHub の Issue のどちらもかなりレスポンスが早く、とても好感を持つようになりました。
まだまだ情報が少ない現在ですので、実際に導入されている方がいましたら情報交換させていただけると嬉しいです!