Перенос основных данных при обновлении нескольких версий
У меня есть приложение для 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. Но это иногда заставляет мою голову вращаться, и я смущаюсь, поэтому я ищу мудрость мудреца.
Ответы
Ответ 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];
}