Не удается создать NSPersistentStoreCoordinator с ошибкой нулевой модели - PullRequest
3 голосов
/ 10 января 2012

У меня есть файл базы данных coreData, который работал отлично.Из-за некоторых особых требований я удалил старый файл модели данных и создал другой файл модели данных с точно такими же объектами . нет изменений в сущностях от предыдущей модели данных.Я сделал это частью другого пакета и ссылаюсь на него из этого пакета.

Код для создания managedObjectModel

   if (managedObjectModel_ != nil) {
    return managedObjectModel_;
}
NSBundle *newBundle = [NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"dataBundle" withExtension:@"bundle"]];   
NSString *modelPath = [newBundle pathForResource:@"DataHouse" ofType:@"momd"];
NSURL *modelURL = [NSURL fileURLWithPath:modelPath];
managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

return managedObjectModel_;

Приложение работает нормально до некоторого времени, и внезапно (случайно) я получаю сообщение об ошибке

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Cannot create an NSPersistentStoreCoordinator with a nil model'
*** First throw call stack:`(0x62e052 0x26a9d0a 0xf6e86d 0x64fd 0x624e 0x381b 0x79c9b 0x65f2d 0x1881e0f 0x1882589 0x186ddfd 0x187c851 0x1827322 0x62fe72 0x160892d 0x1612827 0x1598fa7 0x159aea6 0x163437a 0x16341af 0x602966 0x602407 0x5657c0 0x564db4 0x564ccb 0x2791879 0x279193e 0x17e8a9b 0x28a2 0x2815)`

Код для создания координатора постоянного хранилища

 if (persistentStoreCoordinator_ != nil) {
    return persistentStoreCoordinator_;
}

NSURL *storeURL = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"DataHouse.sqlite"]];

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:

                         [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,

                         [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
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_;

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

ПРИМЕЧАНИЕ: приведенные выше фрагменты кода не являются частью класса AppDelegate.Они являются частью специального класса, который содержит все методы Coredata

Ответы [ 3 ]

6 голосов
/ 12 января 2012

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

NSLog(@"%@", [managedObjectModel_ entities]);

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

NSLog(@"%@", [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"DataHouse.sqlite"]);

Наконец (я думаю, это то, что нужно сделать, потому что это случилось со мной), перейдите в папку на диске, где хранится файл .sqlite:

~/Library/Application Support/iPhone Simulator/5.0/Applications/{your app id}/Documents

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

1 голос
/ 15 февраля 2012

Реальной проблемой оказалась проблема с памятью. Я не использовал основные объекты данных из AppDelegate, и я создаю их в некоторых других классах. Но я не выпустил эти объекты, из-за которых произошла огромная утечка, и приложение упало. Я выпустил основные объекты данных, и теперь мое приложение работает отлично ...

0 голосов
/ 14 января 2016

, если ваше имя модели данных - Model.xcdatamodeid.просто замените параметр URLForResource в качестве имени модели данных в файле AppDelegate.h.

NSURL * modelURL = [[NSBundle mainBundle] URLForResource: @ "Модель" withExtension: @ "momd"];

приведенный ниже код для справки.

  • (NSManagedObjectModel *) managedObjectModel {

    // Модель управляемого объекта для приложения.Это фатальная ошибка

для приложения, которое не может найти и загрузить его модель.

if (_managedObjectModel != nil) {

    return _managedObjectModel;

}

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

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

return _managedObjectModel;

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...