Я продолжаю получать "сбой при сбое" после любых изменений в моей модели данных XCode
Я начал использовать Core Data для разработки iPhone. Я начал с создания очень простой сущности (называемой Evaluation) только с одним строковым свойством (так называемый метод оценкиTopic). У меня был следующий код для вставки новой строки:
- (void)insertNewObject {
// Create a new instance of the entity managed by the fetched results controller.
NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
NSEntityDescription *entity = [[fetchedResultsController fetchRequest] entity];
NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
// If appropriate, configure the new managed object.
[newManagedObject setValue:@"My Repeating String" forKey:@"evaluationTopic"];
// Save the context.
NSError *error;
if (![context save:&error]) {
// Handle the error...
}
[self.tableView reloadData];
}
Это сработало отлично, и нажав кнопку +, новая таблица "My Repeating String" будет добавлена в представление таблицы и будет находиться в постоянном хранилище.
Затем я нажал "Дизайн → Добавить версию модели" в XCode. Я добавил три сущности к существующей сущности, а также добавил новые свойства к существующей сущности "Оценка". Затем я создал новые файлы с объектов, нажав "Файл → Новый файл → Классы управляемых объектов" и создал новые .h и .m файлы для моих четырех объектов, включая объект "Оценка" с Evaluation.h и Оценка.м. Теперь я изменил версию модели, установив "Дизайн → Модель данных → Установить текущую версию". Сделав все это, я изменил свой метод insertMethod:
- (void)insertNewObject {
// Create a new instance of the entity managed by the fetched results controller.
NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];
NSEntityDescription *entity = [[fetchedResultsController fetchRequest] entity];
Evaluation *evaluation = (Evaluation *) [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
// If appropriate, configure the new managed object.
[evaluation setValue:@"My even new string" forKey:@"evaluationSpeechTopic"];
// Save the context.
NSError *error;
if (![context save:&error]) {
// Handle the error...
}
[self.tableView reloadData];
}
Это не работает! Каждый раз, когда я хочу добавить строку, симулятор падает, и я получаю следующее:
"NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation.'"
У меня была эта ошибка, прежде чем я узнал о создании новой версии после изменения чего-либо в datamodel, но почему это все еще происходит? Нужно ли мне делать какое-либо сопоставление (хотя я только что добавил объекты и свойства, которых раньше не было?). В учебнике Apple Dev это звучит очень просто, но я долгое время боролся с этим, никогда не работал после изменения версии модели.
Ответы
Ответ 1
У вас есть параметры NSMigratePersistentStoresAutomaticallyOption и NSInferMappingModelAutomaticallyOption, установленные при создании вашего persistentStoreCoordinator в App Delegate?
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator != nil) {
return persistentStoreCoordinator;
}
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"database.sqlite"]];
NSError *error = nil;
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
// Handle error
}
return persistentStoreCoordinator;
}
Ответ 2
Если вы только получаете эту ошибку в Simulator, вы изменили свою модель данных и не удалили файл sqlite, который вы ранее использовали.
Итак, перейдите к: ~/Library/Application Support/iPhone Simulator/User/Applications/
Затем просмотрите папки с именем HEX, пока не увидите свое приложение. Откройте каталог Documents
и удалите файл sqlite. Ошибка должна исчезнуть.
Ответ 3
если вы используете это на симуляторе /iphone, также удалите приложение тоже. работал на меня на симуляторе только после того, как я удалил приложение!
Ответ 4
Удаление и повторная установка приложения в обоих, симулятор и устройство работали для меня.
Ответ 5
это связано с изменением базы данных, потому что в приложении есть другая база данных, а в библиотеке/поддержке приложений /iPhone Simulator/User/Applications есть другая база данных.... так DELETE. папка приложения работает для меня.
Ответ 6
Имела ту же проблему, и она использовалась для работы, пока я не скопировал код в другую папку в finder и не начал редактировать этот проект, начиная получать ошибку. Я установил, что в моем другом проекте был хранитель хранения с именем xyz.sqlite, "новый" проект, над которым я работал, имел одно и то же имя, должен был изменить его на xyzv2.sqlite(что-то вроде этого). Найден ответ здесь: http://www.iphonedevsdk.com/forum/iphone-sdk-development/27268-nspersistentstorecoordinator-has-no-persistent-stores.html
Ответ 7
Майкл ответит на мое дело.
Я изменил базовую модель данных и начал получать эту ошибку.
Моим решением было удалить приложение (удержать HOME и CROSS приложение) и повторно запустить приложение. Проблема решена!
Ответ 8
Вы также можете попробовать "Reset Содержание и настройки..." в симуляторе. Это то, что сработало для меня.