【问题标题】:Core data Missing Model Version?核心数据缺少模型版本?
【发布时间】:2018-10-24 22:35:42
【问题描述】:

我实际上有一个项目,其中包含 6 个核心数据模型,例如 V1 到 V6,现在所有都在应用商店中,当我尝试将应用程序从旧版本之一(核心数据模型 V3)更新到它崩溃的当前版本时(架构不匹配)

当实际调查时,V3 模型版本在从旧 V3 模型到当前 V3 模型的两个项目版本之间是不同的。

在 V3 版本中我添加了新实体并且没有进行 LightWeight 迁移(忘记这样做),现在有什么方法可以让用户将这个具有 V3 模型的旧应用程序版本升级到当前应用程序版本,比如解决这个(缺少迁移问题)

如果可能的话,请提出任何方法来添加缺少的迁移模型,以便将旧应用版本升级到当前应用版本。

【问题讨论】:

    标签: ios iphone core-data core-data-migration iphonecoredatarecipes


    【解决方案1】:

    addPersistentStore 应该自动执行必要的轻量级迁移。检查该代码是否在您的所有应用程序启动路径中都可访问。

    为此,您需要提供正确的选项集,如下所示:

    do {
        let options = [ NSInferMappingModelAutomaticallyOption : true,
                        NSMigratePersistentStoresAutomaticallyOption : true]
    
        try persistentStoreCoordinator.addPersistentStore(ofType: NSSQLiteStoreType,
                                                          configurationName: nil,
                                                          at: persistentStoreURL,
                                                          options: options)
    } catch {
        fatalError("Problem loading Persistent Store")
    }
    

    还请确保您的主 xcdatamodel 文件指向最新版本的数据模型。 另请注意,以下图片是在选择您的最新版本 xcdatamodel 文件(yourdatamodel 2.xcdatamodel)后拍摄的,而不是根 xcdatamodel 文件(yourdatamodel.xcdatamodel)。

    请注意:

    重新考虑:您真的需要轻量级以外的东西吗?在大多数情况下,轻量级应该可以解决您的问题。

    您可以通过在代码中添加更多字段并停止使用旧字段来摆脱轻量级,从而使 Core Data 的任务更容易。对于依赖旧字段的行,只需运行一些插入/更新/删除操作即可检测到if core data model version change

    为了检查轻量级失败的地方,您可以考虑启用以下 XCode 参数:

    -com.apple.CoreData.MigrationDebug 1
    

    如果轻量级无法完全迁移您的模型(例如您已重命名实体,或数据类型已更改,这是非常不现实的,如果您这样做,您应该重新考虑您的设计),那么您可以考虑这个有点复杂的解决方案:

    • 使用旧模型版本添加持久存储并备份某些外部文件中的现有行(非核心数据)
    • 删除旧的持久存储并使用 addPersistentStore + 较新的模型版本重新创建它
    • 使用更新的持久存储插入备份数据

    如果一切都失败了,那么考虑映射模型替代方案。参考this article for more details

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-15
      • 2019-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      相关资源
      最近更新 更多