Миграция основных данных — как объединить две сущности в одну

У меня есть старая базовая модель данных с двумя объектами:

Первый объект

FirstString имеет атрибут: string1, который является NSString.

Второй объект

SecondString имеет атрибут: string2, который является NSString.

Они имеют отношение один ко многим: первая сущность ‹--->> вторая сущность.

Новый объект — «ComboEntity» — имеет отношение «один к одному» как с первым, так и со вторым объектом.

Теперь у меня есть новая базовая модель данных с новой сущностью.

ComboEntity имеет атрибут: fullString

Вопрос:

Как мне перенести данные и объединить строку 1 и строку 2 в полную строку?

Спасибо!


person Dives    schedule 06.03.2012    source источник
comment
Недавно я сделал это, используя пользовательскую NSEntityMigrationPolicy. Я поработаю над публикацией решения, если вы все еще заинтересованы.   -  person bentford    schedule 15.05.2012
comment
@bentford, как ты это сделал?   -  person Igor    schedule 18.02.2019


Ответы (2)


Вы должны использовать пользовательскую политику сопоставления.

  1. Создайте модель сопоставления из старой версии объекта в новую версию объекта.
  2. Измените свой код, чтобы использовать пользовательскую политику сопоставления вместо автоматической.
  3. Напишите собственный класс политики сопоставления, см. пример ниже:

@interface FullStringFromTwoStringsMappingPolicy : NSEntityMigrationPolicy

- (NSString *)fullStringForMyEntity:(MyEntity *)myEntity;

@end

@implementation FullStringFromTwoStringsMappingPolicy

- (NSString *)fullStringForMyEntity:(MyEntity *)myEntity
{
    return [NSString stringWithFormat:@"%@ %@", myEntity.string1, myEntity.string2];
}

@end

В вашей модели сопоставления вы пишете выражение значения, как показано на снимке экрана. Вместо contactHashMD5 у вас будет атрибут fullString.

введите здесь описание изображения

С наилучшими пожеланиями,

свен

person svena    schedule 06.03.2012
comment
Спасибо svena за быстрый ответ. Это то, что я искал. Но как мне это сделать, если у меня есть две разные сущности, которые я должен объединить. Ваш ответ относится к ситуации для одного объекта другому. Спасибо! - person Dives; 06.03.2012
comment
Действительно, я недостаточно внимательно прочитал ваш вопрос. Ваш сценарий я еще не тестировал. Как первая сущность связана с другой сущностью? - person svena; 06.03.2012
comment
первая и вторая сущности имеют отношение один ко многим. первый объект ‹--›› второй объект. comboEntity имеет отношения один к одному как с первым, так и со вторым. - person Dives; 06.03.2012

Управление версиями модели CoreData имеет обширную поддержку в iOS. По сути, вам нужно создать новую версию вашей модели и создать в ней новый объект (возможно, оставив также старые объекты). Затем, в зависимости от ваших потребностей, вы можете выбрать различные уровни поддержки миграции из фреймворка, начиная с «облегченной миграции», которая просто заполняет новые поля нулями, до «настраиваемых политик миграции объектов», которые позволяют вам определять функции обратного вызова, которые будут сделать процесс миграции произвольной сложности. См. здесь.

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

person MrTJ    schedule 06.03.2012
comment
MrTJ, я прочитал документацию и чувствую себя комфортно, выполняя миграцию вручную с одной сущности на другую. Но в моей ситуации у меня есть два разных объекта, которые мне нужно объединить, чтобы заполнить новый объект. Пример функции обратного вызова с двумя объектами был бы очень полезен. Спасибо. - person Dives; 06.03.2012
comment
У вас должна быть информация, какой экземпляр string1 вы должны комбинировать с конкретной string2. То, что вы делаете здесь, аналогично JOIN в смысле базы данных. Таким образом, вы выполняете итерацию по объекту, который служит ключом в сценарии (и вызываете свои функции обратно), и из обратного вызова вы открываете экземпляр другого объекта, который соответствует вашему ключу. - person MrTJ; 06.03.2012