2

今天早上,我们的 iPhone 应用程序遇到了大麻烦。我们甚至不得不把它从商店里拿出来。

问题是我们对 xcdatamodel 进行了真正的小改动。我们认为更新过程会自动注意以正确的方式交换它,直到我们发现存在类似 CoreData 迁移的东西。

我们正在使用 UIManagedDocument 连接到持久存储。

怎么可能用新文件交换这个文件?在开发过程中,我们只是从设备上卸载了整个应用程序,然后再次安装它,一切正常。我们如何在应用商店中通过更新模拟这个过程?

更新

我尝试像这样设置迁移选项

_database = [[UIIManagedDocument alloc] init];
NSMutableDictionary *options = [[NSMutableDictionary alloc] init];
[options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption],

_database.persistentStoreOptions = options;

但该应用程序仍然崩溃

** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“此 NSPersistentStoreCoordinator 没有持久存储。它无法执行保存操作。


4

1 回答 1

2

关键是管理 xcdatamodel 文件的多个版本。一个版本是当前版本,用于打开根据旧版本创建的数据存储。这样做时,您可以使用迁移映射从一个模型转换到另一个模型。这一切都在这里解释。

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

  1. 安装旧版本;

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

  3. 通过 Xcode 在旧版本之上安装新版本;

较新的版本将具有较新的数据模型;当安装在旧版本之上时,它会找到旧数据存储并且必须尝试迁移它。这正是通过 App Store 进行更新时发生的情况:应用程序二进制文件被替换,但其沙盒数据保持不变,因此新二进制文件会发现它已经存在。

希望这可以帮助。

编辑:

您的代码已缩短,所以我不确定您还没有,但您可以尝试:

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
    [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
    [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

也看看这个帖子

在另一个硬币上,自动迁移并不总是有效,这取决于你对模型所做的更改;当它不起作用时,您需要指定自定义迁移模型。这是一篇关于该主题的内容非常丰富的帖子。

于 2012-09-04T10:22:09.190 回答