2012-06-10 3 views
1

이 오류가 발생합니다 : 작업을 완료 할 수 없습니다. (코코아 오류 134140) * 캐치되지 않은 예외 'NSInvalidArgumentException'으로 인해 앱 종료 중, 이유 : '지정된 영구 저장소를 찾을 수 없습니다.''지정한 영구 저장소를 찾을 수 없습니다.' CoreData의 오류

방금 ​​내 데이터 모델의 새 버전으로 변경되었습니다. 그러나 데이터 모델의 이전 버전을 활성화하면 응용 프로그램이 제대로 작동합니다. 새 버전을 활성화하면 해당 오류가 발생합니다. 내가 만든 유일한 변화는 자동 마이그레이션 기능으로 처리 할 수 ​​있어야하는 데이터 모델에서 모든 변수를 선택 사항이 아닌 것으로 만들었습니다. 왜 [파일 관리자 copyItemAtPath : defaultStorePath toPath : myPathDocs 오류 : & 오류]에 의해 던져 진 오류가없는 경우 영구 저장소를 찾을 수 없다고 나는 이해가 안됩니다.

내 기본 번들의 sqlite 파일이 데이터 모델의 이전 버전에서 왔지만 새 버전에서 제공되는 sqlite 파일이 없다는 사실과 관련이 있다고 생각됩니다. 그러나 자동 마이그레이션은 새 모델에 대한 새 파일을 자체적으로 생성하고 (?) 기존 파일의 데이터를 기존 모델로 마이그레이션합니다. 잘못인가?

내 IOS 응용 프로그램에서 내 리소스에있는 Formats.sqlite라는 파일이 있습니다. 새로 설치 한 후 시작시 응용 프로그램은 응용 프로그램의/Documents 폴더에 기존 Formats.sqlite가 있는지 확인합니다. 존재하지 않으면 주 번들의 복사본을 거기에 복사합니다. 내 모델의 새 버전을 만들기 전에이 모든 작업이 정상적으로 수행되었습니다. 여기에 내가 사용하는 코드가 있습니다 :

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator 
{ 
    int count = [[persistentStoreCoordinator persistentStores] count]; 
    if (persistentStoreCoordinator != nil && count) { 
     return persistentStoreCoordinator; 
    } 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *myPathDocs = [documentsDirectory stringByAppendingPathComponent:@"Formats.sqlite"]; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSError *error = nil; 
    if (![fileManager fileExistsAtPath:myPathDocs]) { 
     NSLog(@"SQLite file not found, copying SQLITE file"); 
     NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"Formats" ofType:@"sqlite"]; 
     if (defaultStorePath) { 
      if(![fileManager copyItemAtPath:defaultStorePath toPath:myPathDocs error:&error]) { 
       NSLog(@"Error copying file at defaultStorePath to the documents path: %@",error); 
      } 
     } 
    } 
    storeURL = [NSURL fileURLWithPath:myPathDocs]; 
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
          [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
          [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, 
          nil]; 
    if (persistentStoreCoordinator == nil) { 
     persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
    } 
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) 
    {//my error code here} 

그렇다면 "여기 내 오류 코드"라는 곳에 오류가 발생합니다. 이 문제를 해결하기 위해 무엇을해야합니까? 왜 이런 일이 일어나는 걸까요? 덧붙여 말하면, 콘솔은 마이그레이션을위한 모든 단계를 뱉어 내고 있지만 그렇게하려고하는 것처럼 보이지만 영구 저장소를 찾을 수는 없습니다. 왜 그 저장소를 찾을 수 없는지 이해하지 못합니다. 빌드 타겟에 추가되었습니다.

사람들이 이전 버전의 앱에서 업그레이드하면 데이터가 이전되고 모든 정보를 다시 입력하지 않아도되는지 확인하고 싶습니다. 감사!

답변

0

오류의 원인을 찾으려면, 내가 디버거에서 오류의 가장 상세한 설명을 얻기 위해이 코드를 사용 :

NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey]; 
    if(detailedErrors != nil && [detailedErrors count] > 0) { 
     for(NSError* detailedError in detailedErrors) { 
      NSLog(@" DetailedError: %@", [detailedError userInfo]); 
     } 
    } else { 
     NSLog(@" %@", [error userInfo]); 
    } 

는 그런 다음 코드를 사용하여 한 후 오류 메시지가 말했다 중 하나가 내 모델의 등록 정보에는 기본값이 없으며 자동 이주가 올바르게 작동하려면 하나가 필요합니다. 해당 속성의 기본값을 추가 한 후에 모든 것이 작동했습니다.

위 코드는 코어 데이터 오류를 디버깅하는 데 매우 유용합니다. 코어 데이터가 없으면 핵심 데이터가 모델의 정확한 속성을 문제의 원인이라고 말할 수 없기 때문입니다. "detailedError"코드를 사용하면 필요한 정확한 정보를 얻을 수있었습니다. 감사합니다. "detailedError."

+2

감사합니다. 나는이 문제를 겪고 있었고 이것을 읽었습니다. 그것은 나를 구했다. 그렇다면 나는 그것을 쓴 사람이라는 것을 깨달았다. 헴. – CommaToast