Миграция основных данных при обновлении нескольких версий - PullRequest
25 голосов
/ 13 октября 2009

У меня есть приложение для iPhone, которое использует Core Data.

Я сделал обновление и использовал облегченную миграцию, чтобы перейти от V1 к V2 моей MOM (модели управляемых объектов). Это сработало отлично.

Что происходит, когда я хочу перейти на V3 (и дальше) моей мамы?

  • Если я решу продолжить «Легкую миграцию», будет ли автоматически выполняться переход с V1 на V3 и с V2 на V3 моей MOM или мне нужно будет что-то сделать дополнительно?
  • Если я решу использовать картографическую модель, что произойдет? Как мне справиться с обновлением V1 и V2 MOM до V3? Нужно ли создавать модель сопоставления для V1 - V3 и V2 - V3?
  • Этот вопрос идет дальше ... что произойдет, когда у меня будет V6 MOM и мне все еще потребуется поддержка возможности обновления с V1 MOM?

Еще один вопрос: как лучше определить версию текущей MOM? Должен ли я использовать isConfiguration: compatibilityWithStoreMetadata:

Спасибо за любую помощь. Я люблю основные данные. Но иногда это заставляет мою голову кружиться, и я запутываюсь, поэтому я ищу мудрой мудрости.

Ответы [ 2 ]

7 голосов
/ 17 мая 2010

Первоначальная публикация была уже много месяцев назад, но я думаю, что лучший ответ найден в книге основных данных Маркуса Зарры (или онлайн в примерах кода). Поищите Google для «прогрессивно-миграционного поля», и вы найдете код для последовательной итерации по моделям, что позволит создавать отображения из модели n в модель n + 1, не беспокоясь о комбинаторном взрыве для создания отображений между всеми парами моделей.

Это может привести к более медленной миграции во время выполнения. Я не исследовал это.

2 голосов
/ 13 октября 2009

Я пошел с обычной миграцией, используя createDestinationInstancesForSourceInstance.
Фрагмент показывает, как переопределить этот метод и как заставить sourceVersion модели мигрировать. Фактическая миграция происходит во вспомогательном классе TZMigrationHelper.

- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)sInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error
{
    float sourceVersion = [[[mapping userInfo] valueForKey:@"sourceVersion"] floatValue];
    if(sourceVersion <= 0.9)
    {
        mapping = [TZMigrationHelper addAttributeMappingForDerivedRTFProperties:sInstance mapping:mapping propertyName:@"someProperty"];
        mapping = [TZMigrationHelper addAttributeMappingForDerivedRTFProperties:sInstance mapping:mapping propertyName:@"anotherProperty"];
        mapping = [TZMigrationHelper addAttributeMappingForDerivedRTFProperties:sInstance mapping:mapping propertyName:@"oneMoreProperty"];     
    }
    return [super createDestinationInstancesForSourceInstance:sInstance entityMapping:mapping manager:manager error:error];
}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...