将 mogenerator 与 Core Data 实体一起使用会导致保存数据存储时出错

Posted

技术标签:

【中文标题】将 mogenerator 与 Core Data 实体一起使用会导致保存数据存储时出错【英文标题】:Using mogenerator with Core Data entities results in error saving the data store 【发布时间】:2013-12-14 21:00:34 【问题描述】:

我有一个 iPad 应用程序,我使用 MagicalRecord 将核心数据实体保存在 SQLite d/b 中。 在我决定使用 FTASync 将核心数据与 Parse.com 同步之前,一切正常。

FTASync 的部分要求是您必须使用 mogenerator 来生成实体类文件。现在,我收到了这个错误:

2013-12-14 12:38:59.375 foo[5451:70b] Failed to save to data store: The operation couldn’t be completed. (Cocoa error 1560.)
2013-12-14 12:38:59.380 foo[5451:70b]   DetailedError: 
    NSLocalizedDescription = "The operation couldn\U2019t be completed. (Cocoa error 1570.)";
    NSValidationErrorKey = objectId;
    NSValidationErrorObject = "<PreferenceData: 0x1149c3a0> (entity: PreferenceData; id: 0x114a7eb0 <x-coredata://03C39CC9-AC6C-4E56-BB5A-67038ACB6801/PreferenceData/p25> ; data: \n    aAddlSvcs1 = \"\";\n    aAddlSvcs10 = \"\";\n    aAddlSvcs11 = \"\";\n    aAddlSvcs12 = \"\";\n    aAddlSvcs2 = \"\";\n    aAddlSvcs3 = \"\";\n    aAddlSvcs4 = \"\";\n    aAddlSvcs5 = \"\";\n    aAddlSvcs6 = \"\";\n    aAddlSvcs7 = \"\";\n    aAddlSvcs8 = \"\";\n    aAddlSvcs9 = \"\";\n    aApptInterval = \"\";\n    aDeleteOldAppts = \"-1\";\n    aDoubleBooking = \"-1\";\n    aHideHelpBtns = 0;\n    aHourFormat12 = 0;\n    aShopCloses = 1200;\n    aShopOpens = 1000;\n    createdHere = 1;\n    deleted = 0;\n    objectId = nil;\n    syncStatus = 2;\n    updatedAt = nil;\n)";

如果我想使用 FTASync 同步我的 Core Data 存储,我必须使用 mogenerator。

那么,除了“它无法完成”之外,这到底是在告诉我什么?我该如何解决这个问题?

更新: 这是来自 XCode 数据模型检查器的图像

【问题讨论】:

只是一个想法,但这可能是因为当NSManagedObject 本身定义了-objectID 方法时,您将objectId 定义为实体上的属性? 另一个想法:NSValidationErrorKey = objectId 听起来好像该属性不满足核心数据模型中定义的某些约束。例如,如果属性不是可选objectId = nil 将不是有效值。 已更新 objectID 在 mogenerator 生成的代码中!正如我所指出的,除非我使用 mogenerator,否则我不能使用 FTASync。有什么想法吗? @spokane-dude:您的错误消息包含NSValidationErrorKey = objectId(带有小写“d”)。这是哪里来的? @spokane-dude:但那是objectID(带有大写“D”)。错误信息是关于objectId(带有小写“d”)。 【参考方案1】:

您已经使用模型编辑器在 xcdatamodel 中定义了一些验证规则:最小/最大值、所需关系、最小/最大字符串长度。

当您通过 GUI 插入对象时,当您尝试创建验证失败的对象时,您会立即看到反馈。但是,如果您在代码中创建或修改对象,除非您尝试保存托管对象上下文,否则您不会看到错误。

您可以在创建 PreferenceData 实例的代码中调用 -validateForUpdate:(或 -validateForInsert: 或 -validateForDelete:)。在构建对象时多次调用它,您会发现哪里出错了。

【讨论】:

以上是关于将 mogenerator 与 Core Data 实体一起使用会导致保存数据存储时出错的主要内容,如果未能解决你的问题,请参考以下文章

Plain Core Data vs Core Data + Magical Record

有没有办法为 Core Data 原始访问器自动生成 @property 和 @dynamic 标签?

XCode 4.6 中的 Mogenerator 和 ARC

mogenerator 不生成文件

将最近保存的数据与 Core Data 一起使用

将数据与 Core Data 同步