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.

Другие вопросы по тегам