RestKit:原语关系的映射



希望标题描述正确。

我得到了以下JSON:{"regions":[{"name":"Region 1", "zipcodes":["80432", "80433"]}, ...]}

我有两个实体RegionZipCode:

@interface Region : NSManagedObject
  @property (nonatomic, retain) NSString * name;
  @property (nonatomic, retain) NSSet *zipCodes;
@end
@interface ZipCode : NSManagedObject
  @property (nonatomic, retain) NSString * zipCode;
  @property (nonatomic, retain) Region *region;
@end

我试着用下面的代码来填充:

RKEntityMapping *regionMapping = [RKEntityMapping mappingForEntityForName:@"Region" inManagedObjectStore:managedObjectStore];
//[regionMapping addConnectionForRelationship:@"zipCodes" connectedBy:@{@"zipCode" : @"zipcodes"}];
[regionMapping addAttributeMappingsFromDictionary:@{@"name":@"name"}];
RKResponseDescriptor *regionDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:regionMapping pathPattern:@"/regions" keyPath:@"regions" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptor:regionDescriptor];

正如你所看到的,我也试图使用addConnectionForRelationship: connectedBy:,我在这个答案中看到,但没有成功。我想我必须为ZipCode创建一个单独的RKEntityMapping,但我不知道如何将其与我现有的代码粘合在一起,而不会重载RKResponseDescriptor

你们中有人遇到过类似的情况吗?你是怎么解决的?上面链接的例子非常相似,但不幸的是,所发布的解决方案非常不完整。

注1:现有的代码写入name到我的数据库,但不创建与ZipCode的任何关系,也没有写入任何邮政编码到我的数据库

注2:我正在使用最新的RestKit版本(0.20pre)

注释3:你可以在这里救我的命;)

提前感谢!

我做过类似的事情,发现addRelationshipMappingWithSourceKeyPath:mapping:效果最好。根据我的理解,对于嵌套关系(相同的请求)使用关系映射,对于跨多个请求创建关系使用连接。

要做到这一点,你可能需要像这样重新格式化你的JSON:
{"regions":[
    {"name":"Region 1", "zipcodes":[
        {"zipcode": "80432"},
        {"zipcode": "80433"}]},
    ...]}

…并将映射更改为以下内容:

RKEntityMapping *regionMapping = [RKEntityMapping mappingForEntityForName:@"Region" inManagedObjectStore:managedObjectStore];
[regionMapping addAttributeMappingsFromArray:@[@"name"]];
RKEntityMapping *zipCodeMapping = [RKEntityMapping mappingForEntityForName:@"ZipCode" inManagedObjectStore:managedObjectStore];
[zipCodeMapping addAttributeMappingsFromArray:@[@"name"]];
[regionMapping addRelationshipMappingWithSourceKeyPath:@"zipcodes" mapping:zipCodeMapping];
RKResponseDescriptor *regionDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:regionMapping pathPattern:@"/regions" keyPath:@"regions" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptor:regionDescriptor];

我还没有尝试映射与JSON格式的关系,你正在使用(字符串数组,而不是一个数组的字典元素),但你可以通过玩周围的zipCode属性映射做到这一点。

最新更新