概要
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 件のコメント:
コメントを投稿