25

我有一个使用 Core Data 的 iPhone 应用程序。

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

当我想进入 MOM 的 V3(及更高版本)时会发生什么?

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

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

感谢您提供任何帮助。我喜欢核心数据。但它有时让我头晕目眩,我感到困惑,这就是为什么我要寻求一些圣人的智慧。

4

2 回答 2

7

最初的帖子是在几个月前发布的,但我认为最好的答案可以在 Marcus Zarra 的 Core Data 书中找到(或在线代码示例中)。谷歌搜索“progressivelyMigrateURL”,人们会发现逐步迭代模型的代码——这将允许创建从模型 n 到模型 n+1 的映射,同时不用担心在所有模型对之间创建映射的组合爆炸。

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

于 2010-05-17T16:49:40.083 回答
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];
}  
于 2009-10-13T07:55:36.860 回答