今天早上我们的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没有持久存储。这不可以 执行保存操作。'
答案 0 :(得分:2)
关键是管理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关于该主题。