使用RKMappingResult通过To Many关系获取核心数据

时间:2013-09-26 03:18:23

标签: ios core-data restkit

我有一个使用restKit的iOS应用程序从服务器提取数据并将其持久保存到核心数据中。

背景信息

服务器的响应具有嵌套对象。见下文。

<node>
    <entryDate>2013-08-31T20:08:53-06:00</entryDate>
    <followId>0</followId>
    <ipAddress>255.255.255.0</ipAddress>
    <likeStatus>-3</likeStatus>
    <nodeId>20</nodeId>
    <personId>2</personId>

    <point>
        <city>Bluffdale</city>
        <copy>An amazing discovery was unearthed as a local farmer was plowing his field</copy>
        <entryDate>2013-08-31T20:08:53-06:00</entryDate>
        <ipAddress>255.255.255.0</ipAddress>            
        //..... removed some to be concise
        <trend>0.0</trend>
    </point>

    <point>
       //there are many points per node all which contain fields like above
    </point>

</node>

我创建了两个实体。一个用于节点级数据,一个用于点级数据。我在两者之间有一对多的关系,我正在映射结果。

RKEntityMapping *nodeMapping = [RKEntityMapping mappingForEntityForName:@"NodeLevel" inManagedObjectStore:managedObjectStore];
    [nodeMapping addAttributeMappingsFromDictionary:@{
     @"followId.text":             @"followId",
     @"likeStatus.text":           @"likeStatus",
     @"nodeId.text":               @"nodeId",
     @"personId.text":             @"personId",
     @"entryDate.text":            @"entryDate"}];

nodeMapping.identificationAttributes = @[ @"nodeId" ];

RKEntityMapping *pointMapping = [RKEntityMapping mappingForEntityForName:@"PointLevel" inManagedObjectStore:managedObjectStore];
    [pointMapping addAttributeMappingsFromDictionary:@{
     @"nodeId.text":               @"nodeId",
     @"copy.text":                 @"paragraph",
     //....removed some to be concise    
     @"trend.text":                @"trend"}];

    pointMapping.identificationAttributes = @[ @"pointId" ];

    [nodeMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"point" toKeyPath:@"node" withMapping:pointMapping]];

目前,节点级数据被映射到节点实体,并且点级数据被映射到点实体。这是我遇到麻烦的地方。

问题

任何给定节点中都有许多点。它们中的每一个都有一个<copy>字段,我需要用它来填充UITextView。这是我使用非嵌套响应的代码,它运行得很好。

[[RKObjectManager sharedManager] getObjectsAtPath:getArticle parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {

    self.htmlString = [[mappingResult.firstObject valueForKey:@"paragraph"]description];

        if (self.htmlString != nil) {

            NSDictionary *options = @{DTUseiOS6Attributes: [NSNumber numberWithBool:YES]};
            NSData *htmlData = [self.htmlString dataUsingEncoding:NSUTF8StringEncoding];
            NSAttributedString *stringArticle = [[NSAttributedString alloc] initWithHTMLData:htmlData options:options documentAttributes:NULL];
            self.newsDetailText.attributedText = stringArticle;
        }

    } failure:^(RKObjectRequestOperation *operation, NSError *error) {
        RKLogError(@"Operation failed with error: %@", error);
}];

但是现在我正在映射嵌套响应,因为the entity NodeLevel is not key value coding-compliant for the key "paragraph"

而抛出异常

使用RKMappingResult非常方便,但我不知道如何指定要从中提取的实体。

有人可以为我拼写这个!

1 个答案:

答案 0 :(得分:0)

RKMappingResult可以为您提供已处理的所有对象的数组。该数组中的第一个对象应该是外部对象。您可能会发现更好地记录映射结果提供的数组和字典,以确切地检查您的结果。

无论如何,数组中的第一个对象应该是NodeLevel的实例,它本身没有paragraph属性。每个关联的PointLevel实例都具有该属性。

您可以直接访问映射结果中的点,但您当然可以通过关系(似乎命名为node?)访问它们。那么问题是你如何决定从哪个点获得paragraph