Невозможно создать 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 ]

157 голосов
/ 13 мая 2012

У меня было точно такое же сообщение об ошибке, как и в оригинальном сообщении. Я боролся с этим часами. Именно эта строка была в моем AppDelegate.m.

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

Для всех, кто ищет это сообщение об ошибке и находит эту ветку .... попробуйте сначала.

Вы должны убедиться, что там, где написано [то же самое с именем xcdatamodeld] .... что это так !!! По какой-то причине у меня там было имя моего проекта, а не имя модели данных.

Изменил его, и он сразу заработал .....

Спасибо Року и Мюллеру за помощь ....... Вы спасли мне дни !!

Gaz.

54 голосов
/ 09 сентября 2011

первая проверка:

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

Если вы получите нулевое значение, возможно, проблема здесь

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

Итак, попробуйте изменить @ "momd" на @ "mom"

20 голосов
/ 12 июня 2012

У меня возникла странная проблема с Xcode 4.3.2 и iOS 5.

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

возвращает допустимый URL, но

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

возвращает нулевой 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 генерирует код, который не работает сам с собой ...

19 голосов
/ 02 августа 2012

У меня была эта проблема, и изменение "мам" на "мам" ничего не сделало. Чтобы это исправить, мне пришлось щелкнуть правой кнопкой мыши файл xcdatamodelId> показать содержимое пакета, а затем удалить скрытый файл .xcurrentversion.

P.S: Эта проблема начала возникать только после того, как я изменил имя файла модели данных.

13 голосов
/ 03 сентября 2012

Другим источником этой ошибки является то, что иногда Xcode не включает модель данных в сборку.

Проверьте этапы сборки вашей цели и убедитесь, что файл * .xcdatamodeld включен вРаздел «Скомпилировать источники».

9 голосов
/ 29 января 2013

Вероятно, произошло то, что ваш файл xcdatamodeld из исходного кода Apple превратился в файл xcdatamodel (без файла d), и поэтому они не считаются одинаковыми.

Самый быстрый способ исправить это - выбрать файл xcdatamodel в навигаторе проекта и в строке меню

Editor->Add Model Version...

и добавьте новую версию вашей модели. Внесите все изменения в новую версию.

Это работает в Xcode 5

6 голосов
/ 24 апреля 2012

У меня возникла та же проблема с @Dominic Williams

, попробуйте изменить имя файла momd ниже (вы можете найти это в методе managedObjectModel по умолчанию), которое так же, как и файл [file name].xcdatamodeld, который высоздано:

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"[same with name of xcdatamodeld]" withExtension:@"momd"];
6 голосов
/ 13 апреля 2015

Я решаю это путем добавления файла базы данных в Copy Bundle Resources.

Перейдите в корень вашего проекта >> выберите цель >> Фазы сборки >> Копировать ресурсы комплекта. Убедитесь, что ваш файл xcdatamodeld был добавлен сюда.

enter image description here

Ни одно из опубликованных решений не сработало для меня. Так что, надеюсь, этот пост поможет кому-то там. Мое приложение падает только в сборках релиза между прочим. Урок выучен. Всегда тестируйте релизные сборки!

Кстати, я считаю этот пост наиболее полезным https://stackoverflow.com/a/6708837/951349.

5 голосов
/ 19 июня 2013

У меня была такая же проблема.Решение состояло из двух ответов:

1) Мне пришлось добавить параметр «подкаталог» в вызов URLForResource

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

2) По неизвестной мне причинемодель данных не была включена при компиляции проекта.Мне пришлось добавить его вручную в «Фазы сборки / ресурсы компиляции».

Только с одним из перечисленных выше решений мое приложение не работало.

4 голосов
/ 08 января 2013

Я решаю проблему, не меняя код.

Я добавляю ModelName.xcdatamodeld через Файл-> Добавить файл вместо перетаскивания файла в Xcode.

 NSString *path=@"ModelName";

NSURL *modelURL = [NSURL fileURLWithPath:[path stringByAppendingPathExtension:@"momd"]];

model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
...