ios - 如何更改核心数据数据库 : baby steps?

标签 ios iphone database core-data database-migration

<分区>


要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预期结果。另请参阅:Stack Overflow question checklist

关闭 9 年前

我有一个 LIVE 应用程序,我想更改核心数据数据库。

我一直在处理迁移错误并阅读了几个问题和答案,但我想问以下问题:

进行此更改的正确顺序步骤是什么?

在我的例子中,我只想将属性添加到单个表,但我从哪里开始,有哪些步骤? 例如,我首先创建一个新版本的 xcdatamodel? 添加属性并创建新的 .h 和 .m 文件或替换现有的? Core Data Model是否需要填写Identifier(当前模型未填写)?

非常感谢。 问候, 马力

最佳答案

以下是对我有用的方法(改编自 Pro Core Data for iOS,Apress)。并且这假定您只是将属性添加到表中。迁移步骤不适用于一些更复杂的模型更改。

准备您的新模型...

  1. 在项目导航器中选择您的数据模型。
  2. 从编辑器菜单中选择添加模型版本。
  3. 接受或更改版本名称(我喜欢去掉空格)并单击“完成”。现在原始模型扩展为显示 2 个模型。一个是原来的,它有一个绿色的复选标记,因为它仍然是被使用的那个。
  4. 选择新模型。
  5. 进行更改。
  6. 在“实用程序” Pane 中显示文件检查器 View 。向下查找模型版本部分并将当前设置为您创建的新模型。您会在项目导航器中看到您的新模型现在带有绿色复选标记。

迁移...

您需要告诉 Xcode 自动处理此迁移,只要迁移适合您所做的所谓的轻量级迁移,它就可以执行此操作。

  1. 在 Xcode 中搜索“addpersistentstorewithtype”。如果您从模板创建应用程序和/或您有一个标准的核心数据堆栈实现,它将在您的应用程序委托(delegate)中的 persistentStoreCoordinator 方法中。
  2. 在 storeURL 声明和错误之间添加一个选项 NSDictionary...

像这样...

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreDataTest.sqlite"];

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

NSError *error = nil;

然后在对 addPersistentStoreWithType:configuration:URL:options:error: 的调用中,将选项参数替换为 nil,如下所示...

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

最后一步是更新所有受影响的 NSManagedObject 子类(如果有的话)。如果对模型的更改很小,直接编辑文件可能会更容易。或者您可以选择重新生成文件(选择实体,然后从编辑器菜单中选择 CreateNSManagedObject 子类...)如果您在 .h 或 .m 中添加了自己的代码,则需要确保保存这些文件首先在桌面等地方创建文件,重新生成文件,然后小心地将代码复制到新生成的文件中。

构建并运行。

关于ios - 如何更改核心数据数据库 : baby steps?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20405102/

上一篇:ios - startMonitoringForRegion : deprecated

下一篇:ios - 在设备方向上设置 UITextVIew 位置

相关文章:

iphone - XCode 4.5 给我 "SenTestingKit/SenTestKit.h"文件未找到,但适用于 4.4.1

iphone - 是否可以将 X11 服务器移植到 iPhone 上?

database - 如何在 firestore 中获取 setData 的 Id?

java - Apache Derby 和 Java - 优化插入

ios - 使用 CIAdditionCompositing 添加纯黑色时的预期行为?

ios - 在 heightForRowAtIndexPath 中推断行高

ios - 更改facebook iOS登录和注销按钮的背景

database - 当 Web 应用程序使用多个数据库(如 Sitecore 拥有)时,写入数据库如何工作

ios - 调用可以抛出,但是没有标记 'try' 错误没有处理: NSRegularExpression

ios - 尝试访问数据库时无法识别 Firebase 唯一标识符(用户 ID)并且应用程序崩溃? swift iOS9