2013-10-24 151 views
2

阅读this answer所以经过测绘串,我不看我的情况是怎样的任何不同,但所提出的解决方案似乎并不在RestKit 0.20.3RestKit 0.20阵列

工作对于以下JSON:

{ 
    "photos": [ 
     "872ac577-3f31-47a0-966e-6f2ed2fbabcd" 
    ], 
    "imageUrl": [ 
     "http://domain/WebAPI/FileUpload/10232013629_21382571406.439790.jpeg" 
    ] 
} 

映射到下列对象:

@class Picture, Site, Survey; 

@interface Job : NSManagedObject 

@property (nonatomic, retain) NSString * jobId; 
@property (nonatomic, retain) NSString * jobName; 
@property (nonatomic, retain) NSString * jobStatusId; 
@property (nonatomic, retain) NSString * jobStatus; 
@property (nonatomic, retain) NSString * projectId; 
@property (nonatomic, retain) NSString * projectType; 
@property (nonatomic, retain) NSString * siteId; 
@property (nonatomic, retain) NSSet *surveys; 
@property (nonatomic, retain) NSSet *photos; 
@property (nonatomic, retain) NSDate *createdDate; 
@property (nonatomic, retain) Site *site; 
@end 

photos是一个Picture对象,看起来像这样:

@interface Picture : NSManagedObject 
@property (nonatomic, retain) NSData * data; 
@property (nonatomic, retain) NSString * photoId; 
@property (nonatomic, retain) NSString * pictureLoc; 
@property (nonatomic, retain) NSString * imageUrl; 
@property (nonatomic, retain) Job *job; 
@property (nonatomic, retain) QuestionAnswer *question; 
@end 

我想将photosimageUrl映射到分别PicturephotoIdimageUrl。我以为我可以用我的Job的映射如下:

RKEntityMapping *ret = [RKEntityMapping mappingForEntityForName:@"Job" inManagedObjectStore:[RKObjectManager sharedManager].managedObjectStore ]; 

[ret addAttributeMappingsFromDictionary: @{ 
              @"photos": @"photos.photoId", 
              @"imageUrl": @"photos.imageUrl", 
              }]; 

然而,映射Job始终没有在photos财产结束。

我知道我正在做正确的所有中间步骤(比如实际使用ret进行映射),因为JSON是一个包含许多其他密钥的片段,我可以在没有任何问题的情况下进行映射。我究竟做错了什么?请告诉我

编辑

改变映射代码按北斗七星的回答是:

RKEntityMapping *ret = [RKEntityMapping mappingForEntityForName:@"Job" inManagedObjectStore:[RKObjectManager sharedManager].managedObjectStore ]; 
RKEntityMapping *subMapping = [RKEntityMapping mappingForEntityForName:@"Picture" inManagedObjectStore:[RKObjectManager sharedManager].managedObjectStore ]; 

[subMapping addAttributeMappingsFromDictionary: @{ 
              @"photos":@"photoId", 
              @"imageUrl":@"imageUrl" 
              }]; 


[ret addPropertyMapping:[RKRelationshipMapping 
         relationshipMappingFromKeyPath:nil 
         toKeyPath:@"photos" 
         withMapping:subMapping]]; 

现在我得到添加了一个Picture对象,但nilphotoIdimageUrl(是的,我检查过以确保我的拼写和大小写正确的JSON键)

回答

0

原因photos从来没有任何内容是您的映射不会告诉它创建一个新对象。

问题是如何告诉它创建单个对象并将两个参数都设置到该对象中。问题是因为你有两个不同的数组。我期望你的JSON是1个数组,其中包含与该特定条目的所有细节有关的字典。 RestKit可以处理两个数组,但它会导致创建2个不同的photo对象。为此,您需要使用nil关键路径以及从ret到该新映射的关系进行第二次映射。

另一种方法是更改​​Job对象,以便它具有2个可转换(或瞬态)属性,即NSArray s。如果您将ret设置为仅映射@"photos" : @"photos"@"imageUrl" : @"imageUrl",则RestKit将映射所有数据,而不映​​射到photo对象。您可以在映射完成后对该数据进行变异,如果您想...

+0

仍然无法捕获值,请参阅上文。作为附注,如果'photos'中有4个对象,则只创建1个'Picture' – StaRbUck42

+0

您所做的更改与我所建议的不同 - 因为它不起作用。 RestKit无法以这种方式映射多个数组。你有什么可以做的照片编号,但没有和图像的网址。唯一明智的做法是更改JSON或将数组映射到Job作品实体中的数组属性。 – Wain

+1

是的,我最终将JSON改为将'photoId'和'imageUrl'数组合并为一个具有'photoId'和'imageUrl'的对象数组作为属性 – StaRbUck42