2016-01-20 127 views
2

我想弄清楚如何使用RestKit实现将API响应映射到CoreData对象。 API使用JSOG标准。这里有一个例子:JSOG API对象的RestKit映射

[ 
    { 
     "@id": "1", 
     "name": "Sally", 
     "friend": { 
      "@id": "2", 
      "name": "Bob", 
      "friend": { 
       "@id": "3", 
       "name": "Fred", 
       "friend": { "@ref": "1" } 
      } 
     } 
    }, 
    { "@ref": "2" }, 
    { "@ref": "3" } 
] 

我将如何创建一个RKEntityMapping这种JSON?简单属性的映射很简单,问题是如何在这里设置关系,以便它们可以与@ref一起使用,当顶级用户对象仅包含@ref时也是如此。

RKEntityMapping *userMapping = [RKEntityMapping mappingForEntityForName:@"Question" 
                inManagedObjectStore:[RKObjectManager sharedManager].managedObjectStore]; 

[userMapping addAttributeMappingsFromDictionary:@ 
{ 
    @"@id" : @"identifier", 
    @"name" : @"name" 
}]; 

[userMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"friend" 
                      toKeyPath:@"friend" 
                      withMapping:userMapping]]; 

我的猜测是,我可以使用下面的代码来处理@ref内的物体:

[userMapping addConnectionForRelationship:@"friend" connectedBy:@{@"@ref": @"@id"}]; 

但它是正确的吗?

  1. 怎么会,我不是一个完整的对象或只是一个参考映射到一个已经提供的对象(通过@ref)实际核心数据对象?
  2. 如何将JSON的顶层元素(作为User对象的列表)映射到User实体的实际列表?

回答

2

使用映射本身添加关系,所以它递归地进行钻取。使用外键映射的参考。


在您的评论之后再看看它,它可能实际上是一个动态映射而不是外键的好候选。这意味着创建一个新的映射,它只是使用@"@ref" : @"identifier"作为连接,而动态映射则查看关键字并决定使用此连接映射还是完整的userMapping

请注意,这两种映射都需要指定identifier是对象的唯一键,并且您应该使用内存缓存来允许找到现有对象而不是创建重复项。

+0

感谢您的回答!我取得了进展,但我认为我没有完全掌握它。我更新了我的问题,澄清了我现在阻止了什么。请看一看。我将如何创建外键映射? – RaffAl

+0

我和@Bearwithme处于同样的境地,而Wain的命题就像是一种魅力!但是有一件事我想知道:是不是可以用'@'符号为keypath加前缀? – ahaese

+0

我似乎记得它是一个问题,由于KVC @ahaese – Wain