所以在阅读了这个答案之后,我看不出我的情况有什么不同,但提出的解决方案似乎在 RestKit 0.20.3 中不起作用
对于以下 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
我想将photos
和imageUrl
分别映射到Picture
的photoId
和imageUrl
中。我想我可以在我的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
对象,但nil
用于photoId
和imageUrl
(是的,我检查以确保 JSON 键的拼写和大小写正确)
photos
中没有任何内容的原因是您的映射没有告诉它创建一个新对象。
问题在于如何告诉它创建一个对象并将两个参数都设置到其中。问题是因为你有 2 个不同的数组。我希望您拥有的 JSON 是 1 个数组,其中包含包含该特定条目的所有详细信息的字典。RestKit 可以处理这两个数组,但它会导致创建 2 个不同的photo
对象。为此,您需要使用nil
键路径以及从ret
到该新映射的关系进行第二个映射。
另一种方法是更改 Job
对象,使其具有 2 个可转换(或瞬态)属性,这些属性NSArray
s。如果您将ret
设置为仅映射@"photos" : @"photos"
并@"imageUrl" : @"imageUrl"
则 RestKit 将映射所有数据,而不是映射到photo
对象。然后,如果需要,您可以在映射完成后更改此数据...