Основна миграция на данни - как да комбинирате два обекта в едно

Имам стар основен модел на данни с два обекта:

Първи обект

FirstString има атрибут: string1, който е NSString

Втори обект

SecondString има атрибут: string2, който е NSString

Те имат връзка едно към много: първи обект ‹--->> втори обект.

Новият обект - "ComboEntity" - има връзка едно към едно както с първия обект, така и с втория обект.

Сега имам нов основен модел на данни с нов обект

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

Въпрос:

Как да мигрирам данните и да комбинирам низ 1 и низ 2 в fullString?

Благодаря!


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
Трябва да имате информацията кой стринг1 екземпляр трябва да комбинирате с определен низ2. Това, което правите тук, е аналогично на JOIN в смисъл на база данни. Така че преминавате през обекта, който служи като ключ в сценария (и получавате обратно извикване на вашите функции) и от обратното извикване отваряте екземпляра на другия обект, който съответства на вашия ключ. - person MrTJ; 06.03.2012