ios - 核心数据缺少模型版本?
问题描述
我实际上有一个项目,其中包含 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)。
提醒一句:
重新考虑:你真的需要轻量级以外的东西吗?在大多数情况下,轻量级应该可以解决您的问题。
您可以通过添加更多字段并停止在代码中使用旧字段来摆脱轻量级,从而使 Core Data 的任务更容易。对于依赖旧字段的行,如果检测到核心数据模型版本更改,只需运行一些插入/更新/删除操作。
为了检查轻量级失败的地方,您可以考虑启用以下 XCode 参数:
-com.apple.CoreData.MigrationDebug 1
如果轻量级无法完全迁移您的模型(例如您已重命名实体,或者数据类型已更改,这是非常不现实的,如果您这样做,您应该重新考虑您的设计),那么您可以考虑一下复杂的解决方案:
- 使用旧模型版本添加持久存储并备份某些外部文件中的现有行(非核心数据)
- 删除旧的持久存储并使用 addPersistentStore + 较新的模型版本重新创建它
- 使用更新的持久存储插入备份数据
如果一切都失败了,那么考虑映射模型替代。有关详细信息,请参阅本文。
推荐阅读
- javascript - 错误类型错误:无法读取未定义的属性“替换”
- python - 在有向图中查找结束节点
- android - 当有一个带按钮的 RecyclerView 时,SetFocus 无法使用硬件键盘处理 Activity 的 EditText
- node.js - MongoDB Node JS UpdateOne 错误:检测到循环依赖
- angular - 离子构建已经开始失败,“装饰器不支持函数表达式”
- r - 有没有办法从列中的最后一个非空白值中提取?
- java - 无法在继承类的构造函数中重新分配最终变量
- python - pybind11中如何处理指针类型参数?
- sql - 将varchar转换为时间戳,然后按ticketid添加时间组
- symfony4 - JMS Serializer 不会在 Symfony 4 中加载元数据配置