jubilee

Programing, Books and more...

CoreDataのマイグレーション(その1)

CoreDataを使ったアプリで、リリース後にエンティティに属性を追加したい場合の対応方法。
もちろん、今のデータを保持したままマイグレーションさせるのが前提。

  • MagicalRecord使用済み
  • アプリリリース後にエンティティに属性を追加する
  • 当然、今保存されているデータは引継がれることが前提

MagicalRecord

セットアップ部分。
AppDelegate.m

1
2
3
4
5
6
7
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ...
    // .xcdatamodelがプロジェクト名と違うし、自動マイグレーションしてほしい(最初から設定済み)
    [MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:@"Model.sqlite"];
    ...
}

どのセットアップメソッドを使用するか

ここを参考:http://www.raywenderlich.com/56879/magicalrecord-tutorial-ios

CoreDataを作成した際の {任意の名前}.xcdatamodel が、プロジェクト名と同じであれば

  • setupCoreDataStack
  • setupCoreDataStackWithInMemoryStore
  • setupAutoMigratingCoreDataStack

違うならば

  • setupCoreDataStackWithStoreNamed:
  • setupCoreDataStackWithAutoMigratingSqliteStoreNamed:

AutoMigrating がついている方は、属性追加などをした際に可能であれば自動でマイグレーションしてくれる。

Xcode

Modelのバージョンを追加

{任意の名前}.xcdatamodel を選択し、Editor –> Add Model Version…
Model Version

Model2

新しく追加したModelに属性を追加

新しく追加した方のモデル(Model2)に属性を追加する。

Current Versionの変更

  • Model.xcdatamodeledを選択する
  • File inspectorを選択し、Model Version -> Current で、追加した方(Model2)を選択する
  • Model2.xcdatamodeledにチェックマークがつく

changeVersion

属性名の変更など

属性名の変更などについては、Lightweightマイグレーションという手法を使用するらしい(未検証) 。
また、マッピングモデルを使ったマイグレーションも存在するらしい(未検証)。

参考