Я начал использовать 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 это звучит очень просто, но я долгое время боролся с этим, никогда не работал после изменения версии модели.