Невозможно создать NSPsistentStoreCoordinator с нулевой моделью

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

* Завершение приложения из-за неперехваченного исключения "NSInvalidArgumentException", причина: "Невозможно создать NSPsistentStoreCoordinator с моделью nil"

Некоторые из моих методов, которые могут вызвать проблему:

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

ИЗМЕНИТЬ

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

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

Ответ 1

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

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

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

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

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

Спасибо Rock и Muller за помощь....... вы спасли мне дни!

Gaz.

Ответ 2

сначала проверьте:

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

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

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

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

Ответ 3

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

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

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

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

возвращает нулевую NSManagedObjectModel. Но после проверки documentation кажется, что 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 генерирует код, который не работает с собой...

Ответ 4

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

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

Ответ 5

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

Проверьте фазы сборки вашей цели и убедитесь, что файл *.xcdatamodeld включен в раздел "Источники компиляции".

Ответ 6

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

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

Editor->Add Model Version...

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

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

Ответ 7

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

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

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

Ответ 8

Я решаю его, добавив файл db в Copy Bundle Resources.

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

enter image description here

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

Кстати, я нашел это сообщение SO наиболее полезным fooobar.com/questions/60880/....

Ответ 9

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

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

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

2) По какой-то причине я не знаю, модель данных не была включена, когда проект был скомпилирован. Мне пришлось добавить его вручную в "Build Phases/Compile resources".

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

Ответ 10

Решение проблемы, о которой вы говорите, прост. Измените расширение файла на "mom" вместо "momd" в URL модели. Готово.

Ответ 11

Я попробовал все решения здесь, и никто из них не работал. Моя проблема возникла после того, как я переименовал проект. По-видимому, Xcode продолжает искать старый файл мам в неправильном месте во время компиляции.

Для тех, кто пробовал все вышеупомянутые решения без успеха, попробуйте проверить полный путь к вашему файлу .xcdatamodeld. Это то, что сработало для меня.

Ответ 12

У меня была такая же проблема, она отлично работала на iOS6, но не на iOS5. Вот как я это решил:

  • Создайте новую версию модели в xcode. (выберите .xcdatamodeld, откройте меню "Редактор" и нажмите "Добавить версию модели..." )
  • Скомпилируйте и убедитесь, что новая версия работает.
  • Установите старый как текущую версию. ( "Текущий" в "Инспекторе файлов" для .xcdatamodeld в разделе "Модель исходных данных ядра" )
  • Удалить ссылку на .xcdatamodeld файл в xcode
  • Щелкните правой кнопкой мыши файл .xcdatamodeld в Finder и выберите "Показать содержимое пакета"
  • Удалить новый .xcdatamodel, который вам не нужен.
  • Повторно добавьте .xcdatamodeld в xcode
  • Компилировать и улыбаться

(Здесь я нашел, как удалить версию модели: Как удалить старую/неиспользуемую версию модели данных в Xcode)

Ответ 13

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

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

 NSString *[email protected]"ModelName";

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

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

Ответ 14

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

При запуске нового проекта Xcode автоматически устанавливает все из названия проекта. Если вы начали вызывать свой проект "Rugbyontv", а затем решили перейти на "RugbyOnTV" и сделали поиск и замену, это сломало бы его. (Кредит Робу за указание, что имя чувствительно к регистру)

Ответ 15

Я смотрел ответ часами и ничего не работал. Но затем я неожиданно обнаружил эту статью . Поэтому в связи с этим проблема заключалась в установке корневого контроллера в этой части AppDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    ListViewController *rootView = (ListViewController *)self.window.rootViewController;
    rootView.managedObjectContext = self.managedObjectContext;
    return YES;
}

Фактически вы должны определить, какой корневой контроллер будет делегировать ваше соединение CoreData. И в моем случае у меня был TabBarController, подключенный к другим представлениям, поэтому мой основной корневой контроллер просмотра был определен как TabBar, и это вызвало ошибку. Я изменил

ListViewController *rootView = (ListViewController *)self.window.rootViewController;

к

ListViewController *rootView = (ListViewController *)self.window.superview;

и все сработало.

Ответ 16

Я знаю, что это не решает вашу проблему, но вчера я столкнулся с этой проблемой, которая беспокоила меня часами, решение @Dominic Williams опубликовало сообщение об ошибке ArrayIndexOutOfBoundsException (независимо от эквивалента Objective-C).

Я не очень хорошо разбираюсь в Objective-C/Xcode, но я работаю над приложением iOS, которое наша компания (главным образом) разработала извне. К сожалению, они часто забывали, как использовать клавиатуру и неправильно использовать заглавные буквы или свойства заклинаний, но были слишком ленивы, чтобы вернуться и изменить его. Они использовали заглавную букву в названии проекта xcode, где это не должно было быть (наше имя продукта не использует капитал), и мне пришлось вернуться назад и изменить каждое появление этого письма в верхнем регистре в нижнем регистре; который включал название проекта, файл основных данных, сотни переменных и т.д.

В любом случае, как только я это сделал, я столкнулся с этой ошибкой, и никакое решение не исправляло ее для меня. Я убедился, что все имена URL были правильными, очистка проекта, удаление приложения, перезагрузка телефона и т.д. Безрезультатно. Я сдался и выключил мой Mac и отправился домой на день. К моему удивлению, я вернулся сегодня утром, и все, казалось, сработало хорошо!

Я понятия не имею, почему это сработало, но если вы застряли, попробуйте перезагрузить свой Mac.

Ответ 17

Если кто-то застрял из-за той же проблемы. Убедитесь, что вы правильно связали базу данных (так как вы могли скопировать код непосредственно из некоторого примера).
Просто обновите имя базы данных в методах managedObjectModel и persistentStoreCoordinator в AppDelegate.

Ответ 18

У меня была такая же проблема, т.е.

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

возвращено nil, потому что не было создано файла .momd.

Причина в том, что в каталоге приложения (например, MyGreatApp/MyGreatApp.app) xcode скопировал файл MyModel.xcdatamodeld вместо генерации MyModel.momd из файла MyModel.xcdatamodeld(с помощью momc).

Решение заключалось в том, чтобы удалить ссылку на MyModel.xcdatamodeld внутри браузера проекта XCode и перетащить ее обратно в проект от поисковика. После этого xcode понял, что ему нужно скомпилировать его в .momd.

Ответ 19

У меня была эта проблема из ниоткуда после того, как я удалил сгенерированное приложение в ~/Library/Application Support/iPhone Simulator. Как-то это привело к тому, что последующие сборки потерпели неудачу в симуляторе и на устройствах. Не изменил ничего общего с CoreData целую вечность, но с Cannot create an NSPersistentStoreCoordinator with a nil model он потерпит неудачу. Пробовал несколько вещей выше и ничего не работал.

Я мог видеть созданную папку momd с файлом mom внутри. Приложение в симуляторе могло видеть оба, но не удалось создать файл sqlite.

Решено было добавить атрибут объекта в файл xcdatamodeld в Xcode и сразу же удалить его. Я надеялся, что это заставит Xcode восстановить все, что вызывало проблему с нуля, и, похоже, это сработало. Все еще неясно, что на самом деле было не так, но мое приложение снова запущено в симуляторе и устройствах.

Ответ 20

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

Не уверен, что это кому-то поможет.

Ответ 22

Хорошо, я сначала скажу половину решения, он будет работать, если вы переустановите приложение (в симуляторе или устройстве отладчика). Но это не настоящее решение наверняка. Например, если вы обновляете свое приложение, НЕ делайте этого, иначе ваша новая версия может произойти сбой, потому что пользователи не будут ее повторно устанавливать, вместо этого они будут использовать кнопку обновления.

Как я понял, эта проблема возникает, главным образом, при изменении имени файла модели данных. Причина может быть такой:
, Когда вы запускаете приложение в первый раз, он создает файл модели данных в комплекте приложений, например "data_model_1". Это создание происходит только в первый раз.
, Когда вы обновите имя файла и запустите приложение еще раз, он не сможет найти, потому что файл "data_model_1" все еще есть, но вы говорите ему, что он ищет "data_model_2". Как он может найти, он еще не создал его и не будет, если вы не установите приложение с новым именем файла.

Итак, если это первая версия вашего приложения и переустановка на симуляторе или устройстве, это не повредит вашему проекту, идите на это. В противном случае проверьте "Руководство по управлению версиями моделей данных и данных" в библиотеке разработчиков iOS, возможно, это то, что вам нужно.

Изменить: если переустановка не работает, попробуйте удалить сначала, затем очистить проект, затем закрыть все, повторно открыть проект и выполнить + запустить. Это должно работать.

Ответ 23

Если ваш проект работает на симуляторе, но не на устройстве, попробуйте запустить сборку release на своем устройстве, а не debug-build.

Выберите проект → Продукт → Изменить схему → Конфигурация сборки [DEBUG → RELEASE]

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

Ответ 24

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

Ответ 25

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

Ответ 26

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

Ответ 27

Я столкнулся с такой же ошибкой, когда я переименовал файл .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

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