Этот NSPersistentStoreCoordinator не имеет постоянных хранилищ (несоответствие схемы или сбой миграции). Не может выполнить операцию сохранения

Я работаю над приложением, в котором мы используем xxxcdatamodel. Теперь в том же xxxcdatamodel я добавил атрибут в одну из сущностей. Приложение аварийно завершает работу, показывая сообщение "Этот NSPersistentStoreCoordinator не имеет постоянных хранилищ (несоответствие схемы или сбой миграции). Он не может выполнить операцию сохранения.". Я пробовал много вещей, и я также использую облегченную миграцию, чтобы справиться с ситуацией, но это также не работает. Ниже приведен мой код:

    - (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (__persistentStoreCoordinator != nil)
    {
        return __persistentStoreCoordinator;
    }

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"myApp.sqlite"];

    NSError *error = nil;
    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

    NSDictionary *options = @{
                              NSMigratePersistentStoresAutomaticallyOption : @YES,
                              NSInferMappingModelAutomaticallyOption : @YES,
                              NSSQLitePragmasOption : @{@"journal_mode" : @"DELETE"}
                              };

    if(![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
    {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    }

    return __persistentStoreCoordinator;
}




- (BOOL) saveContext
{
    @synchronized (_localStorage) {
        //NSLog(@"----------------------------Save context called---------------------------");
        BOOL result = TRUE;
        NSError *error = nil;
        NSManagedObjectContext *managedObjectContext = self.managedObjectContext;

        if (managedObjectContext != nil)
        {
            //Crashes here at this line.
            if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error])
            {
                NSLog(@"----------------------------Save context failed---------------------------");
                result = FALSE;
                NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            }
        }

        //NSLog(@"----------------------------Save context completed---------------------------");

        return result;
    }
}

Я что-то здесь упускаю? ИЛИ Как будто мне нужно выполнить полную миграцию, даже если я добавлю один атрибут в сущность? Заранее спасибо.

5 ответов

Решение

Вам не нужно делать миграцию самостоятельно здесь. Вы должны добавить новую версию модели данных. Вы не можете редактировать xcdatamodel и ожидайте, что Core Data просто использует новую версию. Вам необходимо сохранить существующую модель, создать новую версию и внести изменения в новую версию. У вас всегда должна быть версия модели, соответствующая постоянному файлу хранилища.

Вы создаете новую версию, выбирая xcdatamodel файл модели в браузере файлов Xcode, перейдя в меню "Редактор" и выбрав "Добавить версию модели..."

Я работаю над проектом и столкнулся с похожей проблемой, похоже, бывший разработчик забыл пропустить эти два варианта для облегченной миграции. Я прошел второй, и миграция прошла успешно.

Вы запрашиваете автоматическую облегченную миграцию, используя словарь опций, который вы передаете addPersistentStoreWithType:configuration:URL:options:error:путем установки значений, соответствующих как NSMigratePersistentStoresAutomaticallyOption и NSInferMappingModelAutomaticallyOption ключи к YES:

NSError *error = nil;
NSURL *storeURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel]
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

BOOL success = [psc addPersistentStoreWithType:NSSQLiteStoreType
                configuration:nil URL:storeURL
                options:options error:&error];
if (!success) {
  // Handle the error.
}

Я просто:

  1. Удалите приложение из симулятора.
  2. Чистый.
  3. Сохраните результат.
  4. Создайте приложение заново.

Это отлично работает для меня. Я делаю это постоянно, когда вношу изменения в исходную модель.

В моем случае я изменил имя xcdatamodelвнутри xcdatamodeldупаковка. Мне нужно было отменить изменение имени, чтобы удалить ошибку.

попытался изменить имя модели данных с «xxx.xcdatamodeld» на «xxx2.xcdatamodeld». Это сработало.

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