JSOG API对象的RestKit映射
问题描述:
我想弄清楚如何使用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"}];
但它是正确的吗?
- 怎么会,我不是一个完整的对象或只是一个参考映射到一个已经提供的对象(通过
@ref
)实际核心数据对象? - 如何将JSON的顶层元素(作为
User
对象的列表)映射到User
实体的实际列表?
答
使用映射本身添加关系,所以它递归地进行钻取。使用外键映射的参考。
在您的评论之后再看看它,它可能实际上是一个动态映射而不是外键的好候选。这意味着创建一个新的映射,它只是使用@"@ref" : @"identifier"
作为连接,而动态映射则查看关键字并决定使用此连接映射还是完整的userMapping
。
请注意,这两种映射都需要指定identifier
是对象的唯一键,并且您应该使用内存缓存来允许找到现有对象而不是创建重复项。
感谢您的回答!我取得了进展,但我认为我没有完全掌握它。我更新了我的问题,澄清了我现在阻止了什么。请看一看。我将如何创建外键映射? – RaffAl
我和@Bearwithme处于同样的境地,而Wain的命题就像是一种魅力!但是有一件事我想知道:是不是可以用'@'符号为keypath加前缀? – ahaese
我似乎记得它是一个问题,由于KVC @ahaese – Wain