LoginSignup
2
6

More than 3 years have passed since last update.

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

Posted at

前置き

ネットの情報を色々見て、公式の記述サンプルも見たんですが、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()

        ...
    }
    ...
}

感想、その他メモ

いろいろ試して、(そもそも何でいろいろな書き方があるのか、という話ですが)なんとかデータ引き継ぎできる書き方が見つかってよかったです。
もっと余裕と知識があれば、ダメだった書き方のダメな理由も調べたいんですが、それはまた別の機会に。

2
6
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
2
6