核心数据缺少模型版本?
Core data Missing Model Version?
我实际上有一个项目有 6 个核心数据模型,如 V1 到 V6,当我尝试将应用程序从旧版本(核心数据模型 V3)之一更新到当前版本时,所有这些都在应用程序商店中,它崩溃了(架构不匹配)
当实际调查时,V3 模型版本在两个项目版本之间是不同的,从旧的 V3 模型到当前的 V3 模型。
在 V3 版本中,我添加了新实体,但没有进行轻量级迁移(忘了做),现在我可以通过任何方式让用户将这个带有 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文件(你的数据模型2.xcdatamodel)之后拍摄的,而不是根xcdatamodel文件(yourdatamodel.xcdatamodel).
提醒一句:
重新考虑:你真的需要超越轻量化的东西吗?在大多数情况下,轻量级应该可以解决您的问题。
您可以通过添加更多字段并停止在代码中使用旧字段来摆脱轻量化,从而使 Core Data 的任务更容易。对于依赖于旧字段的行,只需 运行 检测到一些 insert/update/delete 操作 if core data model version change。
为了检查轻量级失败的地方,您可以考虑启用以下 XCode 参数:
-com.apple.CoreData.MigrationDebug 1
如果轻量级不能完全迁移你的模型(比如你重命名了你的实体,或者数据类型已经改变,这是非常不现实的,如果你这样做的话你真的应该重新考虑你的设计),然后你可以考虑这个有点复杂的解决方案:
- 添加旧模型版本的持久存储并备份一些外部文件(非核心数据)中的现有行
- 删除旧的持久存储并使用 addPersistentStore + 更新的模型版本重新创建它
- 使用更新的持久存储插入备份数据
如果其他所有方法都失败,则考虑替代映射模型。参考this article for more details.
我实际上有一个项目有 6 个核心数据模型,如 V1 到 V6,当我尝试将应用程序从旧版本(核心数据模型 V3)之一更新到当前版本时,所有这些都在应用程序商店中,它崩溃了(架构不匹配)
当实际调查时,V3 模型版本在两个项目版本之间是不同的,从旧的 V3 模型到当前的 V3 模型。
在 V3 版本中,我添加了新实体,但没有进行轻量级迁移(忘了做),现在我可以通过任何方式让用户将这个带有 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文件(你的数据模型2.xcdatamodel)之后拍摄的,而不是根xcdatamodel文件(yourdatamodel.xcdatamodel).
提醒一句:
重新考虑:你真的需要超越轻量化的东西吗?在大多数情况下,轻量级应该可以解决您的问题。
您可以通过添加更多字段并停止在代码中使用旧字段来摆脱轻量化,从而使 Core Data 的任务更容易。对于依赖于旧字段的行,只需 运行 检测到一些 insert/update/delete 操作 if core data model version change。
为了检查轻量级失败的地方,您可以考虑启用以下 XCode 参数:
-com.apple.CoreData.MigrationDebug 1
如果轻量级不能完全迁移你的模型(比如你重命名了你的实体,或者数据类型已经改变,这是非常不现实的,如果你这样做的话你真的应该重新考虑你的设计),然后你可以考虑这个有点复杂的解决方案:
- 添加旧模型版本的持久存储并备份一些外部文件(非核心数据)中的现有行
- 删除旧的持久存储并使用 addPersistentStore + 更新的模型版本重新创建它
- 使用更新的持久存储插入备份数据
如果其他所有方法都失败,则考虑替代映射模型。参考this article for more details.