核心数据缺失模型版本?

时间:2018-05-15 07:14:27

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

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

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

在V3版本中我添加了新实体并且没有做LightWeight迁移(忘记这样做),现在是我可以允许用户将这个旧版本的应用版本升级到当前的应用版本,如解决这(缺少迁移问题)

如果可能,请建议添加丢失的迁移模型的任何方法,以便将较旧的应用版本的smith升级到当前的应用版本。

1 个答案:

答案 0 :(得分:0)

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文件指向最新版本的datamodel。 另请注意在选择您最新版本的xcdatamodel文件(yourdatamodel 2.xcdatamodel)后拍摄以下图片,而不是根xcdatamodel文件(yourdatamodel.xcdatamodel)。

enter image description here

提醒:

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

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

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

-com.apple.CoreData.MigrationDebug 1

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

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

如果所有其他方法都失败了,那么考虑替代映射模型。请参阅this article for more details

相关问题