Управление версиями Core Data и миграция с помощью настраиваемой политики

Я нашел документацию очень ограниченной, и мое решение проблемы нигде.

Мне нужно добавить новый объект (с отношением к существующему). Также добавьте и переименуйте некоторые атрибуты существующего объекта.

Пример с легким весом:

У старой модели есть один объект Item с одним name атрибута.

В новой модели я хочу, чтобы Item имел один новый атрибут dateAdded и переименовал name в title . На данный момент, если dateAdded будет необязательным или заданным значением по умолчанию, я мог бы использовать облегченную миграцию. Поправьте меня, если я ошибаюсь.

Но я также хочу добавить новый объект List с атрибутом title . И добавьте ко многим отношениям. Список может быть пустым или иметь много элементов. Элемент должен ссылаться только на один список.

Поэтому я смущен тем, что мне нужно делать и какой порядок.

  1. Включить миграцию с отключенной функцией миграции ( NSDictionary* options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:NO], NSInferMappingModelAutomaticallyOption, nil]; ).

  2. Создайте новую версию модели. Там я делаю изменения, которые хочу.

  3. Создайте новую модель сопоставления. Источник – старая модель, цель – новая модель. В ItemToItem я установил title в $source.name .

Кроме того, Xcode все еще терпит крах при работе с моделью сопоставления, я не знаю, что делать дальше. Я думаю, что мне нужно создать один экземпляр List в контексте и сделать все ссылки на него из-за политики отношений. И я должен использовать пользовательскую NSEntityMigrationPolicy для этого. Любая помощь для решения этой проблемы?

2 Solutions collect form web for “Управление версиями Core Data и миграция с помощью настраиваемой политики”

Ну, я сделал это …

Мои первые 3 шага были правильными. Продолжить сценарий:

Add4. Сделайте ItemToItemMigrationPolicy , подкласс NSEntityMigrationPolicy . Override:

 - (BOOL)beginEntityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error { List* list = (List*)[NSEntityDescription insertNewObjectForEntityForName:@"List" inManagedObjectContext:[manager destinationContext]]; list.name = @"Default list"; return YES; } - (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)sInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error { Item* item = (Item*)[NSEntityDescription insertNewObjectForEntityForName:[mapping destinationEntityName] inManagedObjectContext:[manager destinationContext]]; item.dateAdded = [NSDate date]; task.title = [sInstance valueForKey:@"name"]; [manager associateSourceInstance:sInstance withDestinationInstance:item forEntityMapping:mapping]; return YES; } - (BOOL)createRelationshipsForDestinationInstance:(NSManagedObject *)dInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error { NSFetchRequest* fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"List"]; NSPredicate* predicate = [NSPredicate predicateWithFormat:@"name LIKE 'Default list'"]; fetchRequest.predicate = predicate; NSError* fetchRequestError = nil; NSArray* listsArray = [manager.destinationContext executeFetchRequest:fetchRequest error:&fetchRequestError]; if (fetchRequestError) { NSLog(@"%@", fetchRequestError.localizedDescription); } List* list = [listsArray lastObject]; ((Item*)dInstance).list = list; return YES; } 

ADD5. В Xcode в модели сопоставления установите политику миграции ItemToItem в пользовательскую с помощью ItemToItemMigrationPolicy .

ADD6. Сделайте новую версию модели текущей и сгенерируйте (замените) классы из новых или измененных объектов.

ADD7. Делают изменения в вашем коде, например item.name больше не работает. Теперь это item.title . Очистите проект и запустите.

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

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

  • может ли dataModel of Coredata быть частью любого другого пакета, кроме основного пакета
  • Подготовка к выпуску приложения с coredata
  • Как установить значения по умолчанию для новых свойств для существующих объектов после переноса данных основного веса легкого веса?
  • Перенос основных данных с помощью MagicalRecord - добавьте атрибут и заполните его
  • iOS: какова функция выражения значения при переносе отношений со связью?
  • Я не переносил NSPersistentStore в новую версию, могу ли я восстановить обновление приложения?
  • Основные данные: как просто удалить и перестроить хранилище данных?
  • Обновление приложения для использования основных данных из предыдущего двойного SQLite только постоянного хранилища
  • iCloud, основные данные, миграция и сопоставление моделей
  • Core Data Versioning - требуется несколько моделей сопоставления
  • Как просто удалить старые данные ядра и перестроить новый?
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.