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

the*_*oid 25 migration iphone cocoa core-data mapping-model

我有一个使用Core Data的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:

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

wes*_*der 7

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

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

  • 请注意,由于ios 7 sqlite会创建wal和shm文件,因此您需要在第一次迁移后删除它们.请参阅:http://stackoverflow.com/questions/23460657/coredata-migration-in-ios-7了解更多信息. (2认同)
  • 轻量级迁移还需要逐步迁移吗? (2认同)

Tho*_*ing 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];
}  
Run Code Online (Sandbox Code Playgroud)