iphone - 手动核心数据版本控制

标签 iphone ios xcode core-data versioning

我开发了一个应用程序,iCollege ,现在我想让应用程序变得更好。
在测试时我想从备份中恢复数据。在启动 iCollege 时,应用程序崩溃,因为它无法通过 Core Data 进行版本控制。我现在的问题是,是否可以手动对核心数据文件进行版本控制,即遍历现有文件的每个托管对象,并将对象与事件模型版本相匹配。

这样的事情可能吗?

编辑:非常感谢您快速而详细的回答。我认为我对我的问题的解释不是很好。这是我的问题的另一种描述。
我有一个使用 Core Data 创建的文件,其中包含一些实体 CourseTeacher 的对象。我用这个文件替换了我的应用程序的核心数据文件。当应用程序下次启动时,我想调用一个方法,该方法使用 CourseTeacher 的对象读取文件的托管对象,并将其转换为实体,例如主题教授。属性也可以更改。我的问题是我是否可以这样做,即我可以自己对核心数据文件进行版本控制吗?
我希望我的问题现在可以检查了。 :-)

最佳答案

虽然从理论上讲,您可以手动迁移数据,但这可能不值得。您想使用自动轻量级迁移

要执行自动轻量级迁移,您需要设置两个数据模型,然后在代码中,告诉 Core Data 执行迁移。这意味着您在阅读完本文之前不应修改您的数据模型。如果您有,(自动或手动)恢复您的旧模型。您将需要它来进行迁移。以下是自动轻量级迁移的工作原理:

首先,您需要将模型版本添加到您的数据模型。选择现有模型,然后从 Editor 菜单中添加一个版本:

Select the model

Add a Model Version

系统将提示您命名数据模型并选择它所基于的现有模型。

enter image description here

现在,继续对新模型进行更改。完成后,您需要告诉 Core Data 使用这个新模型作为当前版本。我们还没有完成代码,所以这部分很简单。 (代码也很简单。)在右侧面板上,选择事件模型,如下所示:

enter image description here

确保在左侧导航器中选择了您的模型,否则您可能看不到右侧的选项。你应该得到这样的结果:

enter image description here

(实际上我在这里使用的是版本 2 而不是版本 3,但思路是一样的。)

现在,您需要快速更改代码,以便 Core Data 知道为您执行迁移。

在应用委托(delegate)的 persistentStoreCoordinator 方法中,更改此行:

if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]){

到以下内容(在 if 语句之前的行中添加):

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


if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]){

您实际上已经向 Core Data 传递了一个选项字典,告诉它为您迁移数据存储。 (仔细看前面的代码,通读几遍就明白了。)

编辑:您可能可以做您想做的事。如果我理解正确,你应该创建一个新的模型版本,执行轻量级迁移,然后他们手动进行你想要的更改。我的上述答案仍然有效,只是您之后需要进行一些手动更改。

关于iphone - 手动核心数据版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6413669/

相关文章:

ios - 更正包 ID 的最佳方法

ios - 使用 swift Xcode 6 的默认选项卡栏项目颜色

iphone - 从 NSArray 获取单个属性的 NSArray

iphone - [iPhone]如何自定义分组TableView中Section的标题?

iOS未捕获的异常添加 subview 崩溃

iphone - 如何仅隐藏/禁用第一个 uinavigationbar?

ios - 如何在 Objective-C 中从 HTML 读取 JSON-LD 数据?

ios App 在解除分配 UIView 子类实例时崩溃

ios - 尝试在 viewWillAppear 中 reloadData()

c++ - 我应该如何与使用 Xcode 的开发人员协作?