2018年3月26日月曜日

RealmSwift でマイグレートする方法

概要

RealmSwift ですでに定義したクラスにフィールドを追加したい場合はあると思います
リリースしているアプリの場合、ただ単純にフィールドを追加しただけだとエラーになってしまいます
その場合には正しい手順でマイグレートをしなければいけません

環境

  • macOS 10.13.2
  • Xcode 9.2 (9C40b)
  • RealmSwift 3.1.1

マイグレートする方法

AppDelete.swift の didFinishLaunchingWithOptions に以下を追加します

let config = Realm.Configuration(
  schemaVersion: 1,
  migrationBlock: { migration, oldSchemaVersion in
    if (oldSchemaVersion < 1) {
      // auto migrate
    }
  })

Realm.Configuration.defaultConfiguration = config

let realm = try! Realm()

これだけです、簡単
ただ、新規で追加したフィールドを何かしらの値で初期化するのであれば if 文内にそれを実装しなければなりません
例えば sum というフィールドを追加した場合、初期値が 0 でいいのであれば特に何もする必要はありません
Realm のクラス側でフィールドを 0 で定義すれば OK です
(※ RealmSwift では各フィールドはこちらのルールで初期化されます)
そうではなく例えば score と oldScore フィールドの足した値を sum フィールドに設定して初期化したい場合はその足し算のロジックを実装する必要があります

試してはいないのですがおそらく以下のような感じでできるはずです

if (oldSchemaVersion < 1) {
  migration.enumerateObjects(ofType: UserData.className()) { oldObject, newObject in
    let score = oldObject!["score"] as! Int
    let oldScore = oldObject!["oldScore"] as! Int
    newObject!["sum"] = score + oldScore
  }
}

また schemaVersion を今回「1」にしましたが次もマイグレートする場合は必ずここのバージョンを 2 なり 1 以上の値にしてくださいそうしないとマイグレートが行われません

最後に

RealmSwift でマイグレート処理を試してみました
処理を 1 つ Delegate に追加するだけなので非常に簡単にできます
クラスのスキーマのバージョン管理だけしっかりやる必要があるので定数などにしてちゃんと数字を追えるようにしておくと良いと思います

参考サイト

0 件のコメント:

コメントを投稿