RestKit 0.2映射核心数据< - >具有多对多关系的JSON

时间:2013-08-15 16:27:06

标签: objective-c core-data restkit

我一直在和RestKit争战超过一个星期了,似乎根本无法理解关系映射...我已经尝试过阅读文档和示例,但它似乎没有当我尝试在实践中应用它时有意义。

我暂时放弃了我的应用程序并将所有内容缩减为一个简单的独立项目,该项目具有以下数据模型: enter image description here

  • 模板拥有一组节点。
  • 这些节点的子集也可以在模板中称为“链接”。

生成的类看起来像:

@interface Template : NSManagedObject
@property (nonatomic, retain) NSString * guid;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSSet *links;
@property (nonatomic, retain) NSSet *nodes;
@end

@interface Node : NSManagedObject
@property (nonatomic, retain) NSString * desc;
@property (nonatomic, retain) NSString * guid;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) Template *template;
@end

我正在尝试使用RestKit映射将核心数据模型映射到JSON,并将JSON映射回核心数据。最终将有一个服务器组件,但我也想使用相同的映射来支持将json导入/导出到文件。

以下是我希望JSON查找模板的示例:

{"nodes":[
    {"name":"Node 1","guid":"N-0001","desc":"This is the first node"},
    {"name":"Node 2","guid":"N-0002","desc":"This is the second node"},
    {"name":"Node 3","guid":"N-0003","desc":"This is the third node"}
],
"guid":"T-0001",
"name":"Template 1",
"links":["N-0001","N-0002"]
}

以下是我目前正在使用的映射:

self.nodeMapping = [RKEntityMapping mappingForEntityForName:@"Node" inManagedObjectStore:self.rkManagedObjectStore];
[self.nodeMapping addAttributeMappingsFromDictionary:@{
    @"guid": @"guid",
    @"name": @"name",
    @"desc": @"desc"
 }];
[self.nodeMapping setIdentificationAttributes:@[@"guid"]];

self.templateMapping = [RKEntityMapping mappingForEntityForName:@"Template" inManagedObjectStore:self.rkManagedObjectStore];
[self.templateMapping addAttributeMappingsFromDictionary:@{
    @"guid": @"guid",
    @"name": @"name"
 }];
[self.templateMapping setIdentificationAttributes:@[@"guid"]];

[self.templateMapping addRelationshipMappingWithSourceKeyPath:@"nodes" mapping:self.nodeMapping];

这适用于'节点'关系,但我不能为我的生活找出如何使用ID映射链接。

我尝试过使用

[self.templateMapping addConnectionForRelationship:@"links" connectedBy:@"guid"];

但是当我导入上面的JSON时,这只会使链接属性为空。

我也花了很多时间搞乱这么多不同形式的关系映射和属性映射,一切都会导致来自RestKit的神秘错误,或者根本没有发生任何事情。

有人可以告诉我需要添加到此映射中以获取正确映射的链接吗?

然后我计划使用相同的映射将核心数据模板转储到JSON。我希望我可以使用[self.templateMapping inverseMapping] - 但我已经放弃了这个,直到我可以让导入映射工作。

谢谢

1 个答案:

答案 0 :(得分:1)

在Restkit对象映射文档中查看此部分: Mapping Values without Key Paths

我根据您的JSON结构为您提供了一个快速示例:

RKEntityMapping *linkNodeMapping = [RKEntityMapping mappingForEntityForName:@"Node" inManagedObjectStore:self.rkManagedObjectStore];
[linkNodeMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil toKeyPath:@"guid"]];
[linkNodeMapping setIdentificationAttributes:@[@"guid"]];
RKRelationshipMapping *linkNodesRelationshipMapping = [RKRelationshipMapping relationshipMappingFromKeyPath:@"links"
                                                                                              toKeyPath:@"links"
                                                                                            withMapping:linkNodeMapping];
[self.templateMapping addPropertyMapping:linkNodesRelationshipMapping];