CoreDataのデータ構造を変更した時の対処方法【自動マイグレーション】

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.
}