CoreDataを使ったiOS/Macアプリでデータベースの構造を変更した場合の対処方法です。ここでは、CoreDataの自動マイグレーション機能を利用する方法を説明します。
自動マイグレーションが可能な変更
次の変更の場合に自動マイグレーションが可能です。
- 属性(フィールド)の追加
- 属性(フィールド)の削除
- 非optionalの属性をoptional属性に変更
- optionalの属性を非optionalに変更してデフォルト値を設定
- エンティティ(テーブル)名/属性(フィールド)名の変更
- リレーションの追加とリレーションタイプの変更
- リレーションの追加と削除
- リレーション名の変更
- リレーションタイプの変更(to-one ←→to-many, non-ordered to-many ←→ordered)
- エンティティの階層の変更
- エンティティの追加と削除、エンティティ名の変更
- 親エンティティ/子エンティティの作成と属性の階層間移動
- エンティティを階層外へ移動
※エンティティ階層のマージは不可(親が異なるエンティティは、共通の親を持つようにマージできません)
手順
1. データモデルの新バージョンを作成
XcodeのナビゲーションでCoreDataのデータモデルファイルを選択した状態で Edirtor > “Add Model Version…”を選択します。
バージョンが作成されると、.xcdatamodeldの下にバージョン別のファイルができます。
2. 使用するデータモデルのバージョンを指定
Xcodeのナビゲーションで.xcdatamodeldを選択した状態で、Attributes Inspectorの”Versioned Core Data Model”でCurrentに新しく作成したバージョンを指定します。
3. コードに自動マイグレーションオプションを記述
addPersistentStoreWithType:configuration:URL:options:error:のオプションに次の2つを指定します。
- NSMigratePersistentStoresAutomaticallyOption : YES
- NSInferMappingModelAutomaticallyOption : YES
■コード例
NSError *error = nil; NSURL *storeURL = <#The URL of a persistent store#>; NSPersistentStoreCoordinator *psc = <#The coordinator#>; NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; BOOL success = [psc addPersistentStoreWithType:<#Store type#> configuration:<#Configuration or nil#> URL:storeURL options:options error:&error]; if (!success) { // Handle the error. }