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

qua*_*ark 12 sqlite core-data core-data-migration ios

长话短说,我的核心数据架构已经更改,我的应用程序已提交到应用程序商店,这导致更新应用程序的所有人崩溃.崩溃是NSPersistentStore由于未正确迁移数据模型而导致丢失.

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

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

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

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

Kir*_*nee 7

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

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

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

在此输入图像描述

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

在此输入图像描述

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

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

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