출처 : http://taehoonkoo.tistory.com/172
Core Data는 Modeling Version UP을 했을 경우 자동으로 Data Migration을 해줍니다.
WWDC 2010에서는 아래와 같이 설명하였습니다.

  • 기존에 오래된 모델은 보관해라.
    1. 이유인 즉 이전 데이터를 읽어들이기 위해서 입니다.
  • Store에 대한 옵션 설정을 해라.
    1. 자동으로 업데이트 되기 위해 의해 수정되어야 합니다.

    사용법 >

  • 버전 추가
  • Attribute 변경
  • 소스 변경
  • 현 모델 버전 변경
  • 옵션 추가
  • 버전 추가하기


    프로젝트 파일 리스트에서 .xcdatamodel을 선택 후 상단 메뉴 바 > Editor > Add Model Version.. 을 눌러줍니다.
    새로 모델 버전을 작성할 수 있는 필드가 나오면 이름을 설정해 주시면
    기존 .xcdatamodel에서 .xcdatamodeld으로 변경되면서 서브 리스트 파일로 나뉘게 됩니다.
    아래와 같은 화면을 프로젝트 화면 좌측에서 보실 수 있습니다.

    Attribute 변경하기

    기존 Attribute 이름을 새로운 이름으로 변경 할 경우 아래와 같은 절차를 거치게 됩니다.
    만약 Attribute를 변경하지 않고 새롭게 추가한다면 아래와 같은 절차를 거칠 필요가 없습니다.
    여기서 주의할 점은 위에서 언급했듯이 기존에 Model에서는 변경해서는 안됩니다.

    Attribute를 변경한다고 가정하고 진행을 해보겠습니다.
    기존 attribute는 account이고 새롭게 정의할 attribute는 userid가 되겠습니다.

    소스 변경하기

    위 섹션에서 Attribute를 변경하였다면 역시 Class 멤버 변수도 변경을 해주어야 합니다.
    위에서 기존 account를 userid로 변경하였습니다.
    이 작업은 XCode 내 Refactoring 기능을 이용하면 간단하게 변경이 가능합니다.
    Refactoring (해당 변수위에 커서를 두고 Edit > Refactor > Rename)
    단, NSSortDescriptor나 NSPredicate에서 문자열로 사용한 경우에는 수동으로 찾아서 변경해주어야합니다.

    모델 버전 변경하기

    프로젝트에서 오른쪽 .xcdatamodelid에 커서를 두고 오른쪽 File Inspector에서
    아래와 같이 모델 버전을 변경할 수 있습니다.

    옵션 설정하기

    기본적으로는 Migration기능이 비활성화되어 있으며,
    lightweight migration기능을 활성화 하기 위해서는 아래와 같이 옵션을 설정해주어야 합니다.
    - Option
    NSInferMappingModelAutomaticallyOption
    NSMigratePersistentStoresAutomaticallyOption
    [code]
    NSError *error;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
    // Allow inferred migration from the original version of the application.
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
    [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
    [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
    // Handle the error.
    }
    [/code]