Restkit:当外键设置为 null 时,Core Data 中的关系不会重置

Posted

技术标签:

【中文标题】Restkit:当外键设置为 null 时,Core Data 中的关系不会重置【英文标题】:Restkit: when a foreign key is set to null the relationship in Core Data is not reset 【发布时间】:2013-10-03 13:10:01 【问题描述】:

基本上,当外键变为空时(在设置为值之后),核心数据中的关系不会重置。

以下面的一对多关系为例: 联系人公司(联系人有一个公司,公司有很多联系人)

使用 Restkit 中的以下方法在两个方向上映射:

RKRelationshipMapping *contactCustomerRelationshipMapping = [RKRelationshipMapping relationshipMappingFromKeyPath:@"contacts" toKeyPath:@"hasContacts" withMapping:contactResponseMapping];
[customerResponseMapping addPropertyMapping:contactCustomerRelationshipMapping];
[contactResponseMapping addConnectionForRelationship:@"forCustomer" connectedBy:@@"companyID" : @"identifier"];

然后,假设联系人在核心数据和远程服务器中都链接到公司,因此 JSON 返回: 公司 ID = 123 正确映射到 Core Data 中的关系。

尽管当关系为空时,返回 JSON 以响应 GET 联系人返回:

'contact': 
....
address = "20 Wordworth Ave";
city = "<null>";
"company_id" = "<null>";
...

然后,在核心数据实体中正确设置了 company_id,但关系连接映射器不会通过关系删除对 ID 为 123 的公司的引用。所以看起来 Restkit 没有将外键的 null 值应用于 Core Data 中的关系。

我已验证,仅当 company_id 重置为 null 时才会发生这种情况,而不会在值更改为另一个 company_id 时发生。

如果您对如何解决问题有任何建议,请告诉我。 (现在我正在考虑实现company_id的setter并在它为null时手动重置关系)

非常感谢!


我正在使用最新的 Restkit 开发分支(标记为 0.21.0 - 目前最新版本是 0.20.3 但 blake watters 告诉我开发分支已被标记但他没有时间准备文档) 我实际上正在使用 cocoapods 并包含最新的开发版本: pod 'RestKit', :head

【问题讨论】:

【参考方案1】:

您的解决方法应该是可行的。

这可以归类为 RestKit 中的错误。因此,您最好将其提升为issue。您还可以考虑将其添加为一项功能。

您可以使用fetchRequestBlocks 为 RestKit 提供处理此问题所需的信息,但这会导致对象被删除,这可能不是您想要的。

【讨论】:

谢谢!我确实在一个可能与此相关的现有问题中报告了这一点。 github.com/RestKit/RestKit/issues/669#issuecomment-25571841我现在正在查看直接编辑 RKRelationshipConnectionOperation 中的代码,似乎该错误在 findConnectedValueForConnection:(RKConnectionDescription *)connection shouldConnect:(BOOL *)shouldConnectRelationship 中,它将 shouldConnectRelationship 设置为 NO。这可能是一个更清洁的解决方案...如果您有任何建议,请告诉我;)非常感谢! 其实我的意思是问题可能出在 RKRelationshipConnectionOperation 中的这个方法上,将 shouldConnectRelationship 设置为 NO: - (id)findConnectedValueForConnection:(RKConnectionDescription *)connection shouldConnect:(BOOL *)shouldConnectRelationship

以上是关于Restkit:当外键设置为 null 时,Core Data 中的关系不会重置的主要内容,如果未能解决你的问题,请参考以下文章

仅当外键存在时才保存的标准方法是啥?

在 MS-Access 中,当外键不再存在时,如何在组合框中显示旧的外键?

当外键也是主键时,在 MySQL 上出现外键错误? [复制]

RestKit 对象映射与外键和服务

首次使用实体框架代码时将外键设置为 null

如何递归加载RestKit中由外键标识的嵌套对象?