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

时间:2015-07-23 15:29:00

标签: ios sqlite core-data core-data-migration

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

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

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

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

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

1 个答案:

答案 0 :(得分:7)

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

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

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

enter image description here

2。您可以在图片上看到,我为我的新型号' Model2.0'提供了一个新名称,这是基于我之前的&# 39;型号&#39 ;.
新模型的工作方式与您的旧模型完全相同,此外,新模型的更改将对您的旧模型产生影响。因此,更新后它不会让您的应用崩溃 3。您必须选择新的' Model2.0'作为默认工作模型。为此,请考虑下面的图像。

enter image description here

4. 现在您可以看到有2个型号。请选择' Model.xcdatamodeld'一个主要模型,并打开它的文件检查器'在右侧 - 在上面的图像打开。

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

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