前置き
ネットの情報を色々見て、公式の記述サンプルも見たんですが、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()
...
}
...
}
感想、その他メモ
いろいろ試して、(そもそも何でいろいろな書き方があるのか、という話ですが)なんとかデータ引き継ぎできる書き方が見つかってよかったです。
もっと余裕と知識があれば、ダメだった書き方のダメな理由も調べたいんですが、それはまた別の機会に。