【问题标题】:Core Data Migration Across Multiple Version Upgrades跨多个版本升级的核心数据迁移
【发布时间】:2010-12-06 03:41:02
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 运行时肯定比直接从 v1 跳转到 v15 慢。但是,性能测试将有助于确定我的渐进式迁移是否可行,或者您是否需要完成所有映射。
    • 带有progresslyMigrateURL方法的源代码来自Pragmatic Bookshelf书《核心数据》。链接在这里:pragprog.com/titles/mzcd/source_code
    • Macrus Zarra 的代码很棒,我强烈推荐他的关于核心数据的书。也就是说,如果它以错误的顺序发现.mom 文件,我必须对其进行以下更改以防止它无限递归:gist.github.com/2321704(没有这个,它有可能会继续尝试迁移到相同的版本它已经在,永远。)
    • 请注意,由于 ios 7 sqlite 创建 wal 和 shm 文件,您需要在第一次迁移后删除。请参阅:stackoverflow.com/questions/23460657/… 了解更多信息。
    • 轻量级迁移是否也需要渐进式迁移?
    【解决方案2】:

    我使用 createDestinationInstancesForSourceInstance 进行了普通迁移。
    sn-p 显示如何覆盖该方法以及如何获取要迁移的模型的 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];
    }  
    

    【讨论】:

    • 通过仔细查看 Apple CoreDataVersioning.pdf 文档,它指出迁移过程“尝试找到一个映射模型,该模型从现有商店的托管对象模型映射到由持久存储协调器。”这意味着我确实需要为我的数据库的每个版本创建越来越多的映射模型。因此,对于 V3,我需要一个 V1 到 V3 映射模型以及一个 V2 到 V3 映射模型。所以,我对你的“失败”逻辑以及为什么需要它感到困惑。
    • 您是否尝试过定义多个模型来迁移多个版本是否足够?我想我会删除上面的失败方法,因为我也不确定是否需要它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多