应用更新后的大麻烦。核心数据迁移错误

时间:2012-09-04 10:09:41

标签: 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;

但该应用仍然以

崩溃
  

**因未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'这   NSPersistentStoreCoordinator没有持久存储。这不可以   执行保存操作。'

     

1 个答案:

答案 0 :(得分:2)

关键是管理xcdatamodel文件的多个版本。一个版本是当前版本,用于打开根据旧版本创建的数据存储。执行此操作时,您使用迁移映射将一个模型转换为另一个模型。这一切都解释为here

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

  1. 安装旧版本;

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

  3. 通过Xcode安装较新版本的旧版本;

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

    希望这有帮助。

    编辑:

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

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

    另请查看this post

    在另一个硬币上,自动迁移并不总是有效,这取决于您对模型所做的更改类型;如果它不起作用,您需要指定自定义迁移模型。 This is a very informative post关于该主题。

相关问题