ios - 核心数据缺少模型版本?

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

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

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

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

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

最佳答案

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)后拍摄的。

enter image description here

警告:

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

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

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

-com.apple.CoreData.MigrationDebug 1

如果轻量级不能完全迁移你的模型(比如你重命名了你的实体,或者数据类型发生了变化,这是非常不现实的,如果你正在这样做,你真的应该重新考虑你的设计),那么你可以考虑这个有点复杂的解决方案:

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

如果所有其他方法都失败,请考虑映射模型替代方案。引用this article for more details .

关于ios - 核心数据缺少模型版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50344340/

相关文章:

iphone - CLLocationManager 有时会在应用程序处于后台时停止更新

ios - UINavigationController 框架问题

ios - 此媒体所需的编码器正忙

iphone - 为小型固定大小的 UITableView 禁用单元格重用

ios - 核心数据 - iCloud 行为

ios - 如何让SKSpriteNode不旋转纹理

iphone - 如何在不阻塞 UI 的情况下将内容加载到 TableView 中?

ios - 在 Objective-C 中设置日期格式

ios - NSFetchedResultsController 一次加载所有消息,获取批量大小没有修复它

ios - "fatal error: unexpectedly found nil while unwrapping an Optional value"尝试将谓词与关系对象一起使用时