Подтвердить что ты не робот

Перенос основных данных при обновлении нескольких версий

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

Я сделал обновление и использовал Lightweight Migration, чтобы перейти от V1 к V2 моей MOM (Managed Object Model). Это отлично работало.

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

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

Другой вопрос - какой способ определить версию текущей MOM? Должен ли я использовать isConfiguration: compatibleWithStoreMetadata:

Спасибо за любую помощь. Я люблю Core Data. Но это иногда заставляет мою голову вращаться, и я смущаюсь, поэтому я ищу мудрость мудреца.

4b9b3361

Ответ 1

Первоначальная публикация была теперь много месяцев назад, но я думаю, что лучший ответ можно найти в книге Marcus Zarra Core Data (или онлайн в примерах кода). Google для "progressionMigrateURL", и один найдет код для постепенного повторения с помощью моделей - что позволит создавать сопоставления из модели n в модель n + 1, не беспокоясь о комбинаторном взрыве для создания сопоставлений между всеми парами моделей.

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

Ответ 2

Я пошел с обычной миграцией, используя 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];
}