#ios #core-data #migration
#iOS #core-data #миграция
Вопрос:
Я добавил новую версию в Core Data model. Я добавил новый атрибут к одному объекту ( Seriese
)
Но это вызывает исключение
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Can't merge models with two different entities named 'Seriese''
Я использую следующий код:
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator != nil) {
return persistentStoreCoordinator;
}
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationPrivateDocumentsDirectory] stringByAppendingPathComponent: @"CoreDataTutorialPart4.sqlite"]];
NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:amp;error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return persistentStoreCoordinator;
}
Есть предложения по устранению этой ошибки? Я не хочу терять сохраненные данные
Ответ №1:
Проблема, скорее всего, связана с тем, как вы загружаете управляемую объектную модель. Способ по умолчанию — объединить модели в пакете, однако в этом случае у вас фактически есть две модели с одинаковыми объектами (v1 и v2)… это прекрасно объяснено здесь….Проблемы с миграцией
Комментарии:
1. Я прочитал ссылку, но momd не найден в моем пакете, не могли бы вы дать мне более подробную информацию
2. В Xcode вы выбрали «Дизайн-> Модель данных-> Добавить версию модели» на панели инструментов или вы просто отредактировали существующую модель?
3. Я выполнил Дизайн-> Модель данных-> Добавить версию модели
4. Иногда Xcode может немного запутаться. Первое, что нужно сделать, это очистить все, затем вручную удалить каталог сборки, удалить приложение с устройства / симулятора и перезапустить xcode. Затем повторите попытку, если это не сработает, возможно, вам потребуется полностью удалить модель и создать новую. Я всегда запускаю проекты (с CoreData), создавая версионную модель (даже если мне нужна только 1 версия), это гарантирует, что MOMD настроен правильно. Также проверьте, добавлен ли каталог модели, папка с версиями в, к вашей цели.
5. Если у вас все еще есть проблема и вы хотите прислать мне простую версию проекта, я могу взглянуть на вас.
Ответ №2:
Core Data не понимает, что объект Seriese
в обеих моделях должен быть одним и тем же объектом и что он должен преобразовать атрибуты старого Seriese
в новый Seriese
. Вместо этого он считает, что новый Seriese
следует рассматривать как совершенно новый объект.
Обычно это вызвано попыткой внести изменения в новую версию, которые не может обработать автоматическая миграция. Автоматическая миграция может обрабатывать изменения имен атрибутов, добавление атрибута или другие изменения, которые не влияют ни на что, кроме одного объекта. Как только вы начнете изменять взаимосвязи и / или добавлять новые объекты, вам придется выполнить миграцию вручную.
Вы можете вызвать
[NSMappingModel inferredMappingModelForSourceModel:destinationModel:error:]
… чтобы проверить, возможна ли автоматическая миграция. Если он возвращает nil и / или и ошибку, то вы не можете.