調べたことのまとめです。
実際に試していなので確認はできていません。
前提
Core Data のマイグレーションには大きく分けて2種類ある。
- Lightweightマイグレーション
- データモデル (
*.xcdatamodeld
) を変更するだけで良い - iCloudの Core Data はLightweightマイグレーションしかできない
- データモデル (
- カスタムマイグレーション
- Mapping Model が必要
問題
- Lightweightマイグレーションとカスタムマイグレーションで設定が異なり、この2つを同時に行うことができない
-
addPersistentStoreWithType:configuration:URL:options:
のoptions
の設定- Lightweightマイグレーションでは
NSInferMappingModelAutomaticallyOption: true
を指定する - カスタムマイグレーションでは指定しない
- Lightweightマイグレーションでは
-
- カスタムマイグレーションだけでやろうとすると Mapping Model が大量に必要になる
- たとえばデータモデルが1, 2, 3とあるとき、Mapping Model は 1> 2、 2 -> 3 に加えて 1 -> 3 も必要
解決方法
Progressive Migration と呼ばれる方法がある。
- Mapping Model を使って 1 -> 2、 2 -> 3 と順番にマイグレーションしていく
- 前のバージョンから次のバージョンへのマイグレーションだけを考えればいい
- 最新のバージョンまでマイグレーションを繰り返すので遅い
- 本来はLightweightで済むマイグレーションも Mapping Model が必要?
- サンプルコードなど詳しくは Custom Core Data Migrations · objc.io を参照
最後に
- Lightweightだけで事足りるならLightweightだけのほうが楽
- マイグレーションは難しい問題なので、できるだけマイグレーションしなくて済むように将来の拡張性を考えた余裕のある設計にしよう