NSPersistentStoreCoordinator addPersistentStoreWithType… вызывает исключение
Я пытаюсь использовать Core Data в проекте с кодом, адаптированным из iOS Programming: The Big Nerd Ranch Guide (3-е издание). Открытие файла SQLite вызывает исключение, и никакое чтение документации или поиск в поисковой системе не помогает мне понять, что это значит или как этого избежать.
Данный код находится в методе init класса хранилища данных и выглядит следующим образом:
- (id)init
{
self = [super init];
if (self) {
// snip
NSURL *storeURL = [NSURL fileURLWithPath:[self itemArchivePath]];
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] init];
NSError *error = nil;
if (![psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
[NSException raise:@"Couldn't open the SQL file" format:@"Reason: %@", [error localizedDescription]];
}
// snip
}
return self;
}
Исключение происходит в строке addPersistentStoreWithType:, поэтому мы не делаем это исключение в блоке if. Вот что мне говорят:
2013-07-01 14:46:04.647 (app name)[5859:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: NSStoreModelVersionHashes)'
Когда я устанавливаю точку останова на неисправной строке, Xcode не позволяет мне войти в вызов функции, поэтому я не уверен, откуда исходит NSStoreModelVersionHashes или как избежать его установки на ноль. Я могу po storeURL
и это, кажется, правильный URL. Сброс симулятора iOS, использование другого имени для файла SQL или другие решения, которые я нашел для проблем, которые кажутся касательными, похоже, ничего не помогли.
1 ответ
Координатору постоянного хранилища нужна модель управляемого объекта. Обычно создается с
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel];
где managedObjectModel
ранее был создан с
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"<yourModelName>" withExtension:@"momd"];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
Взгляните на любой пример кода Core Data в библиотеке разработчика Apple, чтобы узнать, как правильно настроить стек Core Data.