Programming

모델을 자동으로 마이그레이션하기 위해 Core Data를 얻으려면 어떻게해야합니까?

procodes 2020. 8. 26. 20:01
반응형

모델을 자동으로 마이그레이션하기 위해 Core Data를 얻으려면 어떻게해야합니까?


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에서 약간의 트릭을 수행해야합니다.

  1. xcdatamodel 파일을 선택하십시오.
  2. 상단의 디자인 메뉴를 선택한 다음 데이터 모델을 선택한 다음 모델 버전 추가를 선택합니다.
  3. 그러면 xcdatamodel 파일이 xcdatamodel 파일과 이름이 같지만 확장자가 xcdatamodeld 인 새 디렉토리로 이동됩니다.이 디렉토리에는 이름에 2가있는 두 번째 파일이 있습니다. 새 파일을 선택한 다음 디자인-> 데이터 모델-> 현재 버전 설정 ( Xcode 4에서는이 작업을 수행합니다 )
  4. 프로젝트가 호환되지 않게하는 변경 사항을 이미 적용한 경우 원본 xcdatamodel 파일에서 이러한 변경 사항을 가져옵니다. 아직 변경하지 않았다면 2.xcdatamodel 파일 (방금 현재 버전으로 만든 파일)을 편집하십시오.
  5. 이제 이전 모델이있는 기기에이 버전을 설치하면 해당 모델이 새 모델로 자동 업그레이드됩니다.

이것은 내가 원했던 것만 큼 훌륭하고 간단 해 보이지만 모델을 변경할 때 개발 중에주의해야한다고 생각합니다. 그렇지 않으면 각 변경에 대해 새 버전을 만들어야합니다.

내가 할 일은 변경된 파일을 모두 보관하고 업데이트를 배포 할 준비가되면 중간 파일을 모두 삭제하고 가장 오래된 모델과 최신 모델로 배포하는 것입니다.


업데이트 (2011 년 7 월 15 일) :

Apple에 업데이트 된 문서가 있음을 지적 해 주신 @ rockstarberlin 에게 감사드립니다 .

Xcode 4 : 관리 개체 모델의 현재 버전 설정

업데이트 : 2013 년 8 월 19 일 더 나은 링크 :

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmModelFormat.html


이것은 매우 도움이되었습니다. 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에서 수행하는 방법에 대한 설명입니다.

Xcode 4 : 관리 개체 모델의 현재 버전 설정


나는 수년 동안이 문제를 겪어 왔으며 이러한 모든 답변을 아무 소용이 없었습니다. 오늘 나는 마침내 내가 뭘 잘못하고 있는지 알아 냈습니다. 아주 간단한 문제지만 간과했습니다. 최신 버전의 데이터 모델을 만들 때 열을 추가하는 경우 선택 사항으로 표시해야합니다. 그렇지 않으면 새 열 값이 채워지지 않기 때문에 단순 마이그레이션이 작동하지 않습니다.

새 열에 "선택 사항"이 선택되어 있는지 확인하자마자 마이그레이션을 다시 시도했고 제대로 작동했습니다.


I stumbled onto this post because of a different problems, but the error was "The model configuration used to open the store is incompatible with the one that was used to create the store."

Here was my problem and the solution to it. In my model, I was using configurations. I had some of the entities being stored in one file and the others in a second file. (I have some defaults that might periodically need to get downloaded, and it would be an incredible pain to merge them into the whole). Anyhow, I made a new entity. The program seemed to run fine, but whenever I'd quit, I got the above error.

The solution there was to look at my configurations, realize that I had an entity that wasn't currently in any of the configurations, and add it to one. Runs like a dream.

This won't fix the OP's problem. But maybe some frustrated person who lands here via google will be in the boat I was in :)


iOS 4.0+

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"model" withExtension:@"momd"];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

Minor edit to @Grouchal's awesome instructions above for Xcode version 5:

Old: 2. Select the Design Menu at the top - then Data Model - then choose Add Model Version

Version 5+: 2. Select the Editor menu, then Add Model Version…, type your Version name and Based on model (select your original model from the list)

참고URL : https://stackoverflow.com/questions/1018155/what-do-i-have-to-do-to-get-core-data-to-automatically-migrate-models

반응형