今天早上我们的 iPhone 应用程序遇到了大麻烦。我们甚至不得不把它从商店下架。
问题是我们对 xcdatamodel 做了真正的小改动。我们认为更新过程会自动以正确的方式进行交换,直到我们发现存在 CoreData 迁移之类的东西。
我们正在使用 UIManagedDocument 连接到持久存储。
如何才能将此文件与新文件交换?在开发过程中,我们只是从设备上卸载了整个应用程序,然后再次安装,一切正常。我们如何在应用商店中通过更新来模拟这个过程?
更新
我尝试像这样设置迁移选项
_database = [[UIIManagedDocument alloc] init];
NSMutableDictionary *options = [[NSMutableDictionary alloc] init];
[options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption],
_database.persistentStoreOptions = options;
但是应用程序仍然崩溃
** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation.'
最佳答案
关键是管理 xcdatamodel 文件的多个版本。其中一个版本是当前版本,用于打开根据旧版本创建的数据存储。执行此操作时,您可以使用迁移映射从一种模型转换为另一种模型。这都解释了here .
关于你的问题:如何模拟更新过程,实际上你不需要做任何特殊的事情:
安装旧版本;
用一些数据填充其数据存储;
通过 Xcode 在旧版本之上安装新版本;
较新的版本将具有较新的数据模型;当安装在旧版本之上时,它将找到旧的数据存储,并且必须尝试迁移它。这正是通过 App Store 进行更新时发生的情况:应用程序二进制文件被替换,但其沙箱数据保持不变,因此新的二进制文件会发现它已经存在。
希望这有帮助。
编辑:
您的代码已缩短,所以我不确定您还没有,但您可以尝试:
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
另请查看this post .
在另一种硬币上,自动迁移并不总是有效,这取决于您对模型所做的更改类型;当它不起作用时,您需要指定自定义迁移模型。 This is a very informative post关于主题。
关于ios - 应用程序更新后出现大问题。 CoreData迁移错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12261234/