长话短说,我的核心数据架构已经更改,我的应用程序已提交到应用程序商店,这导致更新应用程序的所有人崩溃。由于未正确迁移数据模型,导致崩溃的原因是缺少NSPersistentStore
。
我仍然在文档目录中看到.sqlite和相关的数据库文件,如果我降级到旧版本,一切都可以正常使用所有数据。我的问题是,通过以某种方式迁移现有的NSPersistentStore
并将其添加到NSPersistentStoreCoordinator,可以通过应用更新恢复吗?
编辑:
我没有直接对我的数据模型进行任何更改,但我已经确定了问题所在。我正在使用NSManagedObjectModel
检索我的[NSManagedObjectModel mergedModelFromBundles:nil]
,它合并了捆绑包中存在的所有数据模型。这包括XMPPFramework附带的所有数据模型,现在框架已被删除,传递到[[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel]
的NSManagedObjectModel不同,从而导致崩溃。
我通过使用FMDB获取现有数据库的内容解决了这个问题,然后创建了一个新的sqlite文件,并将持久存储协调器指向该新的sqlite文件。然后,我通过循环现有数据并创建适当的NSManagedObject
,将所有现有数据插入到新数据库中。我也停止使用mergedModelFromBundles
来检索我的数据模型,而是使用initWithContentsOfURL
。
答案 0 :(得分:7)
实际上你可能在第一个版本之后以某种方式更新了xcdatamodel,并且你没有为第二个版本创建一个新的xcdatamodel模型。因此,在第二次更新时它会崩溃。
注意:首次发布版本后,您必须创建xcdatamodel的第二个模型版本。
创建xcdatamodel的第二个模型版本 -
1。首先您必须选择Model.xcdatamodeld - >转到菜单上的编辑器 - >添加模型版本。在这里,您必须命名一个模型版本,并根据您想要创建这个新模型的旧模型
现在无论您想要做什么改变,都应该在新的模型版本xcdatamodel上进行。
2。您可以在图片上看到,我为我的新型号' Model2.0'提供了一个新名称,这是基于我之前的&# 39;型号&#39 ;.
新模型的工作方式与您的旧模型完全相同,此外,新模型的更改将对您的旧模型产生影响。因此,更新后它不会让您的应用崩溃
3。您必须选择新的' Model2.0'作为默认工作模型。为此,请考虑下面的图像。
4. 现在您可以看到有2个型号。请选择' Model.xcdatamodeld'一个主要模型,并打开它的文件检查器'在右侧 - 在上面的图像打开。
5. 有'型号版本'右侧的字段,表示当前的'在这个项目中选择的模型。请选择新型号' Model2.0'为您的更新版本。现在你可以运行,它将继续正常工作。
注意:请确保您现在所做的任何更改都会在您的新型号' Model2.0'上进行,因此它不会与之发生冲突你的旧模特。如果要在更新的应用程序版本上更改xcdatamodel的配置,则必须每次都创建新模型。