【Swift】 RealmSwiftのマイグレーション(データ引き継ぎ有)方法


前置き

ネットの情報を色々見て、公式の記述サンプルも見たんですが、Realmのマイグレーションがうまく行かない。より正確には、schemaVersionを更新して、レコードフォーマットも更新されて、アプリが稼働することは確認できるのに、マイグレーション前のデータが引き継がれない。

とにかく「これでマイグレーションできました」っていうブログ等の書き方を片っ端から試していって、結果、下記の書き方でうまく行ったので備忘録として残します。


開発環境

端末:MacBook Pro/MacOS 10.14.5(Mojave)

Xcode:10.2.1

Swift:5


実装内容


ソースサンプル


RealmSwift.swift

import Foundation

import RealmSwift

class myRoutine: Object {
@objc dynamic var column1 = String()
@objc dynamic var column2 = String()
@objc dynamic var column3 = String()
@objc dynamic var column4 = String()
@objc dynamic var column5 = String()
}

func realmMigration() {
// Realmマイグレーションバージョン
// レコードフォーマットを変更する場合、このバージョンも上げていく。
let migSchemaVersion: UInt64 = 1

// マイグレーション設定
let config = Realm.Configuration(
schemaVersion: migSchemaVersion,
migrationBlock: { migration, oldSchemaVersion in
if (oldSchemaVersion < migSchemaVersion) {
}})
Realm.Configuration.defaultConfiguration = config
}


ライフサイクルの早い段階でマイグレーション処理 realmMigration() を呼び出す


ViewController.swift

class ViewController: UIViewController {

...

// 自分の場合は、作ってるアプリのライフサイクルで一番早いのが
// awakeFromNib()だったのでここに書いています。
override func awakeFromNib() {
realmMigration()

// realmを使う時のおまじない
realm = try! Realm()

...
}
...
}



感想、その他メモ

いろいろ試して、(そもそも何でいろいろな書き方があるのか、という話ですが)なんとかデータ引き継ぎできる書き方が見つかってよかったです。

もっと余裕と知識があれば、ダメだった書き方のダメな理由も調べたいんですが、それはまた別の機会に。