2012-09-04 38 views
2

今天上午,我们有我们的iPhone应用程序带来了很大麻烦。我们甚至不得不从商店里拿走它。应用更新后的麻烦很大。 CoreData迁移错误

事情是,我们对xcdatamodel进行了真正的小改动。我们认为更新过程会自动关注正确的交换方式,直到我们发现CoreData迁移存在为止。

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

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

UPDATE

我尝试设置这样的

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

_database.persistentStoreOptions = options; 

迁移选项,但应用仍与

**终止应用程序崩溃是由于未捕获的异常 'NSInternalInconsistencyException',原因:'This NSPersistentStoreCoordinator没有持久性存储。它不能 执行保存操作。'


回答

2

这里的关键是管理你的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关于这个话题。