【问题标题】:RestKit: Inverse Relationship Empty After Initial MappingRestKit:初始映射后为空的反向关系
【发布时间】:2014-07-28 07:45:36
【问题描述】:

尝试通过单个响应连接我的 API 中的两个实体。

{
    "id": 4546,
    "body": "Direct message",
    "status": "received",
    "from": {
      "id": 723,
      "signature": "Mr. Whatever"
    },
    "sent_at": "2014-06-05T21:33:15Z",
    "sent_to": ...
  }

对象是Message 实体,from 字段是嵌套的Sender 实体。下面是相关的关系映射:

RKEntityMapping *senderMapping = [RKEntityMapping mappingForEntityForName:@"Sender"
                                                          inManagedObjectStore:[AMModelManager sharedManager].managedObjectStore];

    senderMapping.identificationAttributes = @[ @"remoteId" ];
    [senderMapping addAttributeMappingsFromDictionary:@{
                                                         @"id" : @"remoteId",
                                                         @"signature" : @"signature"
                                                         }];

    [messageMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"from"
                                                                                   toKeyPath:@"sender"
                                                                                 withMapping:senderMapping]];

第一次映射对象时,没有建立关系。我看到它在日志中被映射,但是当我打印任何特定的 Sender 对象时,它的 messages 反向关系显示一个空数组而不是关系错误。

Mapped relationship object from keyPath 'from' to 'sender'. Value: <Sender: 0x16a10990> (entity: Sender; id: 0x16a14580 <x-coredata:///Sender/t16539BDF-5606-442B-9EE2-D88363FB04AD29> ; data: {
    messages =     (
    );
    remoteId = 723;
    signature = "Mr. Whatever";
})

当我想搜索来自给定发件人的所有消息时,这会使我在应用程序中的获取请求失败。

下次我运行应用程序并再次进行映射时,所有Message 和Sender 实体都被重新映射,关系按预期连接,我的提取请求按预期运行。

我真的不知道为什么这种关系在初始加载时无效。我不知道这是 Core Data 配置问题还是 RestKit 问题,但这让我抓狂,我希望能获得任何额外的见解。如有必要,很高兴提供更多信息。

编辑

这与建议的副本不同,因为这是to-one 关系,因此使用RKAssignmentPolicyUnion 的建议答案不适用。

更新

这是我正在为我正在收听的控制器使用的获取请求:

NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:@"Sender"];
    fetch.predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(SELF.messages, $message, $message.direct == %@).@count > 0 && SELF.remoteId != %@", @(YES), user.remoteId];
    fetch.sortDescriptors = @[
                              [NSSortDescriptor sortDescriptorWithKey:@"signature" ascending:YES selector:@selector(caseInsensitiveCompare:)]
                              ];

在语义上,我想说“给我所有直接向当前用户发送消息的发件人,以及不是当前用户的发件人,按他们的签名排序。”

此获取请求会获取我在检索数据后运行它时所期望的 Sender 对象,但控制器不会触发更新,并且我的表保持为空,直到我下次运行应用程序。

【问题讨论】:

  • 你有没有安排好关系?
  • 我没有。多对多 Sender&lt;-&gt;&gt;Message 的“有序”复选框未选中。你能解释一下这会如何影响吗?
  • 有一些关于有序集的错误,只是想知道这是否可能是一个潜在的原因。 JSON 是否包含同一项目的多个副本(一个包含嵌套内容,一个没有嵌套内容)?我之前没有看到你的问题,所以我只是想考虑潜在的原因......
  • 所有Message JSON 对象都将包含一个Sender 对象,其中许多将是相同的Sender,是的。绝不应该存在没有from 字段的Message 对象。

标签: ios core-data restkit one-to-many entity-relationship


【解决方案1】:

K,另一个经典案例“你做错了,你找错地方来修复它。”

我在我的Message 实体的实现上重写了didChangeValueForKey: 方法以监视某些瞬态状态,而忽略了调用[super didChangeValueForKey:key],这使映射中的反向连接分配变得更加困难。 Core Data 或 RestKit 绝对没有问题。只是我粗心。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-17
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    相关资源
    最近更新 更多