Подтвердить что ты не робот

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

4b9b3361

Ответ 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 Содержание и настройки..." в симуляторе. Это то, что сработало для меня.