Этот 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.
}
Я просто:
- Удалите приложение из симулятора.
- Чистый.
- Сохраните результат.
- Создайте приложение заново.
Это отлично работает для меня. Я делаю это постоянно, когда вношу изменения в исходную модель.
В моем случае я изменил имя
xcdatamodel
внутри
xcdatamodeld
упаковка. Мне нужно было отменить изменение имени, чтобы удалить ошибку.
попытался изменить имя модели данных с «xxx.xcdatamodeld» на «xxx2.xcdatamodeld». Это сработало.