我没有在新版本中迁移NSPersistentStore,我可以通过应用更新进行恢复吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我没有在新版本中迁移NSPersistentStore,我可以通过应用更新进行恢复吗?相关的知识,希望对你有一定的参考价值。

长话短说,我的核心数据架构发生了变化,我的应用程序被提交到应用程序商店,这导致更新应用程序的每个人都崩溃了。由于没有正确迁移数据模型,导致崩溃是由于缺少NSPersistentStore引起的。

我仍然在文档目录中看到.sqlite和相关的数据库文件,如果我降级到旧版本,一切都可以正常使用所有数据。我的问题是,通过以某种方式迁移现有的NSPersistentStore并将其添加到NSPersistentStoreCoordinator,我可以通过应用程序更新从中恢复吗?

编辑:所以我自己并没有真正改变我的xcdatamodel,因此,“长话短说”。但是,我确实从我的项目中删除了XMPPFramework,我觉得这可能会导致核心数据问题。

编辑: 我没有直接对我的数据模型进行任何更改,但我已经确定了问题所在。我使用NSManagedObjectModel检索我的[NSManagedObjectModel mergedModelFromBundles:nil],它合并了捆绑包中存在的所有数据模型。这包括XMPPFramework附带的所有数据模型,现在框架已被删除,传递到[[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel]的NSManagedObjectModel不同,从而导致崩溃。

我通过使用FMDB获取现有数据库的内容解决了这个问题,然后创建了一个新的sqlite文件,并将持久存储协调器指向该新的sqlite文件。然后,我通过循环现有数据并创建适当的NSManagedObjects,将所有现有数据插入到新数据库中。我也停止使用mergedModelFromBundles来检索我的数据模型,而是使用initWithContentsOfURL

答案

实际上你可能在第一个版本之后以某种方式更新了xcdatamodel,而你没有为第二个版本创建一个新的xcdatamodel模型。所以在第二次更新时它崩溃了。

注意:首次发布版本后,您必须创建xcdatamodel的第二个模型版本。

要创建xcdatamodel的第二个模型版本 - 1.首先你必须选择Model.xcdatamodeld - >转到菜单上的编辑器 - >添加模型版本。在这里,您必须命名一个模型版本,并根据您要创建这个新模型的旧模型。 现在无论您想要做什么改变,都应该在新的模型版本xcdatamodel上进行。

enter image description here

2.你可以在图像上看到,我给我的新模型'Model2.0'赋了一个新名字,它基于我之前的'Model'。 新模型的工作方式与您的旧模型完全相同,此外,新模型的更改不会影响您的旧模型。所以它不会在更新后崩溃你的应用程序。 3.您必须选择新的“Model2.0”作为默认工作模型。为此,请考虑下面的图像。

enter image description here

这里你可以看到现在有2个模型。请选择'Model.xcdatamodeld'作为主模型,并在右侧打开它的'File Inspector' - 在上面的图像上打开。

5.右侧有“模型版本”字段,表示在此项目中选择的“当前”模型。请为您的更新版本选择新型号“Model2.0”。现在你可以运行,它将继续正常工作。

注意:请确保您现在所做的任何更改,您将在新型号“Model2.0”上进行更改,因此它不会与您的旧型号发生冲突。如果要在更新的应用程序版本上更改xcdatamodel的配置,则必须每次都创建新模型。

以上是关于我没有在新版本中迁移NSPersistentStore,我可以通过应用更新进行恢复吗?的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 消息服务在新版本中从不调用 onMessageReceived()

VS2015:错误列表在新版本中没有被清除

在新版本中添加现有实体的新属性时核心数据崩溃

wpf动态数据显示ChartPlotter.AddLineChart功能在新版本中有所不同

如何在新版本中访问 Flutter BLoC 状态值?

ios coredata 会在新版本中更改实体属性导致崩溃