Невозможно создать NSPersistentStoreCoordinator с нулевой моделью - PullRequest
95 голосов
/ 09 сентября 2011

У меня был первый взлом Core Core, и я получаю следующую ошибку при запуске моего кода на моем устройстве, но он прекрасно работает на симуляторе.

* Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «Невозможно создать 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;
    }

EDIT

Я скопировал и вставил метод managedObjectContext (см. Ниже) из Apple CoreDataBooks, и теперь он работает. Хотя не совсем понятно, почему

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

Ответы [ 27 ]

0 голосов
/ 14 ноября 2012

Если ваш проект работает на симуляторе, но не на устройстве, попробуйте запустить сборку релиза на вашем устройстве вместо отладочной сборки.

Выберите ваш проект -> Продукт -> Редактировать схему -> Конфигурация сборки [DEBUG -> RELEASE]

Теперь запустите проект снова, он будет работать.

0 голосов
/ 22 января 2014

После того, как я исправил проблему с именами, ошибка осталась. Затем это сработало после перезапуска Xcode 5. Это может автоматически сделать то же самое, что и некоторые из предлагаемых здесь ссылок на ручные ссылки.

0 голосов
/ 26 января 2013

Я также сталкиваюсь с этой проблемой, но когда я изменяю файл ModelName.xcdatamodeld, он работает.так что я думаю ModelName.xcdatamodeld файл не добавлен должным образом, поэтому однажды проверьте и очистите приложение и запустите его.

0 голосов
/ 22 ноября 2014

Для меня проблема была связана с тем, что я скопировал и вставил свою модель из проекта песочницы в свой реальный проект. Всегда убедитесь, что вы сгенерировали модель из проекта, в котором она используется.

0 голосов
/ 20 сентября 2012

У меня была похожая проблема при обновлении с IOS5 до IOS6. Оказывается, это была чувствительная к регистру проблема с названием модели.

Не уверен, поможет ли это кому-нибудь.

0 голосов
/ 09 сентября 2015

Я столкнулся с той же ошибкой, когда i переименовал файл .xcdatamodel из xcode и изменил переименованное имя в делегате приложения, где бы это ни было необходимо, но я все еще получал ту же ошибку.Ни одна из предложенных процедур не сработала для меня.

Затем я открыл папку в Finder и нашел дополнительный файл .xccurrentversion вместе с файлом .xcdatamodel.Я открыл его в TextEdit приложении и изменил это:

<dict>
    <key>_XCCurrentVersionName</key>
    <string>Your_Renamed_Model_FileName.xcdatamodel</string>
</dict>

Я использую это с Xcode 6.4, OSX Yosemite 10.10.1

Надеюсь, это поможет!

0 голосов
/ 11 октября 2012

См. Также эту тему: Модульному тесту не удается найти файл модели базовых данных

Это помогло мне решить проблему, которая возникла только при юнит-тестировании

...