[objective-c] nil 모델로 NSPersistentStoreCoordinator를 만들 수 없습니다.

Core Data에서 첫 번째 균열이 발생했으며 장치에서 코드를 실행할 때 다음 오류가 발생하지만 시뮬레이터에서는 제대로 작동합니다 ..

* 포착되지 않은 예외 ‘NSInvalidArgumentException’으로 인해 앱 종료, 이유 : ‘nil 모델로 NSPersistentStoreCoordinator를 생성 할 수 없음’

문제를 일으킬 수있는 내 방법 중 일부 :

    - (NSManagedObjectContext *)managedObjectContext
{
    if (__managedObjectContext != nil)
    {
        return __managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil)
    {
        __managedObjectContext = [[NSManagedObjectContext alloc] init];
        [__managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return __managedObjectContext;
}

/**
 Returns the managed object model for the application.
 If the model doesn't already exist, it is created from the application's model.
 */
- (NSManagedObjectModel *)managedObjectModel
{
    if (__managedObjectModel != nil)
    {
        return __managedObjectModel;
    }
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"RugbyOnTv" withExtension:@"momd"];
    __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return __managedObjectModel;
}

/**
 Returns the persistent store coordinator for the application.
 If the coordinator doesn't already exist, it is created and the application's store added to it.
 */
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (__persistentStoreCoordinator != nil)
    {
        return __persistentStoreCoordinator;
    }

    NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"RugbyOnTV.sqlite"];

    NSURL *storeUrl = [NSURL fileURLWithPath:storePath];

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];

    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;
}


    - (NSString *)applicationDocumentsDirectory {

        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
        return basePath;
    }

편집하다

Apple의 CoreDataBooks에서 managedObjectContext 메서드 (아래)를 복사하여 붙여 넣었는데 이제 작동합니다.

- (NSManagedObjectModel *)managedObjectModel {
    if (managedObjectModel != nil) {
        return managedObjectModel;
    }
    managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
    return managedObjectModel;
}



답변

원본 게시물과 똑같은 오류 메시지가 표시되었습니다. 나는 이것과 몇 시간 동안 씨름하고 있었다. 내 AppDelegate.m의이 줄이었습니다.

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"[same with name of xcdatamodeld]" withExtension:@"momd"];

이 오류 메시지를 검색하고이 스레드를 찾는 모든 사람을 위해 먼저 시도해보십시오.

[xcdatamodeld의 이름과 동일] …. 그것이 있는지 확인해야합니다 !!! 어떤 이유로 내 프로젝트 이름은 데이터 모델 이름이 아니라 거기에있었습니다.

그것을 바꾸고 곧바로 작동했습니다 …..

기여 해주신 Rock & Muller에게 감사합니다.

Gaz.


답변

먼저 확인 :

NSLog(@"%@", [self managedObjectModel]);

nil 값을 얻으면 문제가 여기에있을 수 있습니다.

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"RugbyOnTv" withExtension:@"momd"];

그러니 @ “momd”를 @ “mom”로 바꿔보세요.


답변

Xcode 4.3.2 및 iOS 5에서 이상한 문제가 발생했습니다.

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"NAME_OF_THE_MODEL" withExtension:@"momd"];

유효한 URL을 반환하지만

__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

null NSManagedObjectModel을 반환합니다. 그러나 문서를 확인한 후 NSManagedObjectModel에 NAME_OF_THE_MODEL.momd가 NAME_OF_THE_MODEL.mom 파일이 포함 된 디렉토리 인 파일이 필요한 것 같습니다. URL을 다음으로 변경

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"NAME_OF_THE_MODEL" withExtension:@"mom" subdirectory:@"NAME_OF_THE_MODEL.momd"];

그런 다음 작동합니다. Xcode가 자체적으로 작동하지 않는 코드를 생성한다는 것이 이상해 보입니다 …


답변

나는이 문제가 있었고 “엄마”를 “엄마”로 바꾸는 것은 아무것도하지 않았다. 이 문제를 해결하려면 xcdatamodelId 파일> 패키지 내용 표시를 마우스 오른쪽 버튼으로 클릭 한 다음 숨겨진 .xcurrentversion 파일을 삭제해야했습니다.

추신 :이 문제는 데이터 모델 파일의 이름을 변경 한 후에 만 ​​발생하기 시작했습니다.


답변

이 오류의 또 다른 원인은 때때로 Xcode가 빌드에 데이터 모델을 포함하지 않는다는 것입니다.

타겟의 빌드 단계를 확인하고 * .xcdatamodeld 파일이 컴파일 소스 섹션에 포함되어 있는지 확인합니다.


답변

아마도 일어난 일은 Apple의 소스 코드에서 xcdatamodeld 파일이 xcdatamodel (d없이) 파일로 바뀌었기 때문에 동일하게 간주되지 않는다는 것입니다.

이를 수정하는 가장 빠른 방법은 프로젝트 탐색기와 메뉴 모음에서 xcdatamodel 파일을 선택하는 것입니다.

Editor->Add Model Version...

모델의 새 버전을 추가하십시오. 새 버전을 모두 변경하십시오.

이것은 Xcode 5에서 작동합니다.


답변

db 파일을 Copy Bundle Resources.

프로젝트의 루트로 이동 >> 대상 선택 >> 빌드 단계 >> 번들 리소스 복사. xcdatamodeld 파일이 여기에 추가되었는지 확인하십시오.

여기에 이미지 설명 입력

게시 된 솔루션 중 어느 것도 나를 위해 일하지 않았습니다. 이 게시물이 누군가에게 도움이되기를 바랍니다. 내 앱은 릴리스 빌드 btw에서만 충돌합니다. 교훈을 얻었습니다. 항상 릴리스 빌드를 테스트하십시오!

BTW, 나는 이것이 가장 유용한 게시물 인 https://stackoverflow.com/a/6708837/951349를 발견했습니다 .