多版本升级的核心数据迁移

时间:2009-10-12 22:43:30

标签: iphone cocoa core-data migration mapping-model

我有一个使用核心数据的iPhone应用程序。

我做了一次更新,并使用轻量级迁移从我的MOM(托管对象模型)的V1到V2。这非常有效。

当我想要去我妈妈的V3(及以上)时会发生什么?

  • 如果我决定继续轻量级迁移,它是否会自动处理从我的MOM从V1迁移到V3和V2到V3的转移,还是需要做一些额外的事情?
  • 如果我决定使用映射模型,会发生什么?如何处理将V1和V2 MOM升级到V3的问题?我是否需要为V1到V3和V2到V3创建映射模型?
  • 这个问题更进一步......当我拥有V6 MOM并且仍然需要支持从V1 MOM升级的可能性时会发生什么?

另一个问题是确定当前MOM版本的最佳方法是什么?我应该使用isConfiguration:compatibleWithStoreMetadata:

感谢您的帮助。我很喜欢核心数据。但它有时让我头晕目眩,我感到困惑,这就是我寻求一些圣人智慧的原因。

2 个答案:

答案 0 :(得分:7)

最初的帖子现在已经发布了很多个月,但我认为最好的答案可以在Marcus Zarra的核心数据手册中找到(或者在代码示例中在线)。谷歌的“渐进式云计算”,人们将找到逐步迭代模型的代码 - 这将允许人们创建从模型n到模型n + 1的映射,同时不用担心在所有模型配对之间创建映射的组合爆炸。

这可能会导致运行时迁移速度变慢。我没有调查过这个。

答案 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];
}