Core Data 모델의 자동 / 경량 마이그레이션에 대한 설명서를 읽었지만 구현하는 데 문제가 있습니다.
내가 이해했듯이 응용 프로그램은 보유한 모델과 장치에 존재하는 모델이 이미 동일하지 않음을 인식해야합니다. 속성 또는 관계 및 유사한 간단한 변경 만 추가 한 경우 모델을 자동으로 업그레이드해야합니다.
모든 포인터-Xcode에서 무언가를 설정해야합니까?
답변:
나는 이것이 매우 간단하다는 것을 알았습니다.
내 AppDelegate에서 NSPersistentStoreCoordinator를 설정했습니다. 여기에 몇 가지 옵션을 추가하여 자동 마이그레이션을 처리하도록 지시해야합니다.
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
NSError *error;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
// Handle error
NSLog(@"Problem with PersistentStoreCoordinator: %@",error);
}
그런 다음 xCode에서 약간의 트릭을 수행해야합니다.
이것은 내가 원했던 것만 큼 훌륭하고 간단 해 보이지만 모델을 변경할 때 개발 중에주의해야한다고 생각합니다. 그렇지 않으면 각 변경에 대해 새 버전을 만들어야합니다.
내가 할 일은 변경된 파일을 모두 보관하고 업데이트를 배포 할 준비가되면 중간 파일을 모두 삭제하고 가장 오래된 모델과 최신 모델로 배포하는 것입니다.
업데이트 (2011 년 7 월 15 일) :
Apple에 업데이트 된 문서가 있음을 지적 해 주신 @ rockstarberlin 에게 감사드립니다 .
업데이트 : 2013 년 8 월 19 일 더 나은 링크 :
이것은 매우 도움이되었습니다. Apple 문서는 평소와 같이 매우 불완전했습니다. 이러한 변경을 수행 한 후 처음 실행할 때 "Ca n't merge models with two different entity xxx"라는 오류가 발생 했으므로 클린 빌드를 수행하는 것이 좋습니다. 깨끗한 빌드가 문제를 해결했습니다.
Grouchal의 대답은 완벽합니다. 그러나 빌드를 여러 번 정리 한 후에도 여전히 "Ca n't merge models with two different entity xxx"가있는 경우 ... managedObjectModel이로드되는 방식에 문제가있을 수 있습니다. . 이것 좀보세요 ... 제가 고치는 데 도움이되었습니다 ..
Santthosh의 답변에 대한 후속 조치를 취하기 위해 대신 코드 스 니펫을 여기에 게시 할 것이라고 생각했습니다. 그렇지 않으면 오류가 발생 하는 initWithContentsOfURL:
대신에 managedObjectModel을 만들어야합니다 mergedModelFromBundles:
.
두 개의 다른 엔티티 XXX 및 XXX와 모델을 병합 할 수 없습니다.
모델 파일의 이름이 "Model"인 경우 managedObjectModel을 만드는 방법은 다음과 같습니다.
NSString *path = [[NSBundle mainBundle] pathForResource:@"Model" ofType:@"momd"];
NSURL *momURL = [NSURL fileURLWithPath:path];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];
이 블로그 게시물에 대한 크레딧 입니다.
Xcode 4의 메뉴가 약간 변경되었습니다. 다음은 Xcode 4에서 수행하는 방법에 대한 설명입니다.
다른 문제 때문에이 게시물을 우연히 발견했지만 오류는 " 스토어를 여는 데 사용 된 모델 구성이 스토어를 만드는 데 사용 된 것과 호환되지 않습니다. " 였습니다.
여기에 내 문제와 해결책이 있습니다. 내 모델에서는 구성 을 사용했습니다 . 일부 엔티티는 한 파일에 저장되고 나머지는 두 번째 파일에 저장되었습니다. (주기적으로 다운로드해야 할 몇 가지 기본값이 있으며이를 전체로 병합하는 것은 엄청난 고통이 될 것입니다). 어쨌든 나는 새로운 엔티티를 만들었습니다. 프로그램이 잘 실행되는 것 같았지만 종료 할 때마다 위의 오류가 발생했습니다.
해결책은 내 구성을보고 현재 어떤 구성에도없는 엔티티가 있음을 깨닫고이를 하나에 추가하는 것이 었습니다. 꿈처럼 달린다.
이것은 OP의 문제를 해결하지 않습니다. 그러나 아마도 구글을 통해 여기에 착륙하는 좌절 된 사람은 내가 탔던 배에있을 것입니다. :)
iOS 4.0 이상
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"model" withExtension:@"momd"];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];