ios - 应用程序更新后出现大问题。 CoreData迁移错误

标签 ios core-data core-data-migration uimanageddocument

今天早上我们的 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 .

关于你的问题:如何模拟更新过程,实际上你不需要做任何特殊的事情:

  1. 安装旧版本;

  2. 用一些数据填充其数据存储;

  3. 通过 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/

相关文章:

objective-c - Objective-C - 从当前时间创建角度

ios - 删除/重置核心数据中的所有条目?

ios - 如何访问mod包中的mom文件?

iphone - 在 CoreData 中使用 NSInMemoryStoreType 会丢失数据吗?

ios - 如何使用 RestKit 0.2 和 Core Data 添加非嵌入式 JSON 对象和关系之间的映射?

iOS 核心数据迁移超时

ios - 核心数据——轻量级迁移不起作用

ios - AVAudioSession 在混合和非混合模式之间切换

ios - 在不配置 APNs 身份验证 key 的情况下发送推送通知

ios - Alamofire String is not identical to AnyObject 错误