Cocoa CoreDataのEntitiyを変更した場合に自動マイグレーションをする

iPhone
Xcode

CoreDataのEntityを変更した場合、マイグレーション処理をしなければアプリケーションが落ちてしまいます。ここでは自動マイグレーションについて説明します。

1. 「設計 – データモデル – モデルバージョンを追加」
 [プロジェクト名].xcdatamodeld内に
  [プロジェクト名] 2.xcdatamodel が追加されます。

2. 新しくできたモデルに対して変更を行います。

3. 「新規ファイル – Resource – Mapping Model」を選びマッピングファイルを作成します。
 ここでは下記のようにします。
  モデル名:map_01_02.xcmappingmodel
  ソースモデル:[プロジェクト名].xcdatamodel
  デスティネーションモデル:[プロジェクト名] 2.xcdatamodel

4. 作成したマッピングファイルを開き、適宜変更箇所の調整をします。

5. AppDelegate.mにマイグレーション用のコードを追加します。
  - (NSPersistentStoreCoordinator *)persistentStoreCoordinatorを下記のように変更します。

    
    if (persistentStoreCoordinator_ != nil) {
        return persistentStoreCoordinator_;
    }
    
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"[ ファイル名 ].sqlite"];
    

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

    NSError *error = nil;
    persistentStoreCoordinator_ = NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel;
    if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    
    
    return persistentStoreCoordinator_;

6. Xcodeで[プロジェクト名] 2.xcdatamodelを選択し
 「設計 – データモデル – 現在のバージョンを設定」を選択し、「ビルドと実行」でアプリケーションが落ちなければ完了です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です