【问题标题】:Seeking recommendations for best RestKit/CoreData mapping and JSON structure for shallow routes为浅层路由寻求最佳 RestKit/CoreData 映射和 JSON 结构的建议
【发布时间】:2014-02-03 21:29:01
【问题描述】:

我正在开发一个由 (Rails) REST API(支持浅路由)支持的 CoreData iOS 应用。因为图中有很多对象,我希望 REST GET 不包含很多嵌套结果,而是只包含 RestKit 用来建立(错误)关系的引用。然后,我将根据需要使用浅层路由来请求单个(或一组)对象。

假设我有一个一对多 (>) 数据模型,例如 A > B,我有:

RKEntityMapping *a_mapping = [RKEntityMapping mappingForEntityForName:@"A" inManagedObjectStore:managedObjectStore];
[a_mapping addAttributeMappingsFromDictionary:@{@"a_id" : @"aId", ...}];
a_mapping.identificationAttributes = @[@"aId"];

RKEntityMapping *b_mapping = [RKEntityMapping mappingForEntityForName:@"B" inManagedObjectStore:managedObjectStore];
[b_mapping addAttributeMappingsFromDictionary:@{@"b_id" : @"bId", ...}];
b_mapping.identificationAttributes = @[@"bId"];

[a_mapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"bs" toKeyPath:@"bs" withMapping:b_mapping]];

我有这些路线:

NSIndexSet *statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful);

RKResponseDescriptor *a_ResponseDescriptor;
a_ResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:a_mapping method:RKRequestMethodGET pathPattern:@"/A/:aId" keyPath:@"A" statusCodes:statusCodes];

RKResponseDescriptor *b_ResponseDescriptor;
NSIndexSet *statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful);
b_ResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:b_mapping method:RKRequestMethodGET pathPattern:@"/B/:bId" keyPath:@"B" statusCodes:statusCodes];

[[RKObjectManager sharedManager] addResponseDescriptor:a_ResponseDescriptor];
[[RKObjectManager sharedManager] addResponseDescriptor:b_ResponseDescriptor];

我有几个相关的问题:

  • 在返回“A”记录时我应该如何构造 JSON,以便 RestKit 为任何相关的“B”对象实例化存根?

  • 同样,如果我想请求一堆 B 对象(没有 A 对象的先验知识),在返回“B”记录时如何构造 JSON,以便 RestKit 为拥有的“A”实例化存根'对象?

  • RestKit 需要哪些额外的设置/代码?

目前,我有一个方向工作(A --> B),但我似乎无法弄清楚如何让相反的工作。特别是,/A/1.json 返回如下内容:

{"a": {"a_id":1, "bs":[{"b_id": 2}, {"b_id": 3}]}}

然后 B/2.json 返回:

{"b": {"b_id":2, "a_id": 1}}

我应该改用类似的东西吗:

{"b": {"b_id":2, "a": {"a_id": 1}}} 

?任何帮助/建议将不胜感激。

【问题讨论】:

    标签: ruby-on-rails core-data restkit restkit-0.20


    【解决方案1】:

    故障是核心数据的概念。 RestKit 涉及在数据存储中创建对象,但正是从数据存储中获取它们的行为使它们出错。听起来您更感兴趣的是让 RestKit 在数据存储中创建“存根”对象(具有正确 id 和关系但没有设置详细属性的对象),以便稍后在需要时填充它们。

    /A/1.json 的当前映射和 JSON 非常适合创建 A 的存根实例和连接的 Bs 的存根。

    B/2.json 只会创建一个存根B(它不会对A 做任何事情,因为映射没有附加关系信息)。这是“错误”的映射,而不是 JSON。将RKRelationshipMapping 添加到B 的映射中,将创建存根并建立连接。

    也就是说,您通常不会请求B,因为您通常需要请求A 才能获得B

    最后,您不需要对存根和细节进行不同的映射。只需 1 个包含所有详细信息和 id 映射的映射,RestKit 将根据收到的 JSON 做所有事情(因此,如果 JSON 仅包含 id,您将只获得存根对象)。

    【讨论】:

    • 你说得对:我不应该互换“故障”和“存根”术语。此外,不幸的是,我在最初的描述中并不清楚:我正在向 B(没有 A)发出请求,这需要反向存根。我发现只输入 ID 会导致异常,因为 RestKit 试图将它们视为具有属性的对象,而不是整数。我将在上面的描述中添加更多细节。
    • 只要您的 JSON 始终是带有嵌套 B(作为对象)的 A 或带有嵌套 A(作为对象)的 B,那么带有嵌套映射的映射就会覆盖它。如果您的 JSON 仅包含一个 id 数组,那么您将需要不同样式的映射。
    • 是的,这就是我发现的。我不得不建立一个双向的 RKRelationshipMappings,但这是有道理的。感谢您的帮助。
    【解决方案2】:

    以韦恩所说的为基础,解决方案是:

    • 建立双向 RKRelationshipMappings
    • 在为 A 和 B 对象发送 JSON 时使用具有嵌套映射的映射。前任。 {"b": {"b_id":2, "a": {"a_id": 1}}}

    另外,如果您使用的是 iOS 模拟器,请务必将您的 HTTP 响应标头设置为不缓存内容。自从我的代码使用过时的数据以来,这让我很受打击。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      • 2012-12-07
      • 1970-01-01
      相关资源
      最近更新 更多