2

所以在阅读了这个答案之后,我看不出我的情况有什么不同,但是建议的解决方案似乎在 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

我想将 and 分别映射photosimageUrl' PicturesphotoIdimageUrl中。我想我可以在我Job的映射中使用以下内容:

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

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

但是,映射的Job结果总是在photos属性中没有任何内容。

我知道我正确地执行了所有中间步骤(就像实际ret用于映射一样),因为 JSON 是一个包含许多其他键的片段,我可以毫无问题地映射。我究竟做错了什么?请告诉我

编辑

根据 Wain 的回答更改了映射代码:

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添加了一个对象,但是使用了nilforphotoIdimageUrl(是的,我检查以确保 JSON 键的拼写和大写正确)

4

1 回答 1

0

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

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

另一种方法是更改Job​​对象,使其具有 2 个可变换(或瞬态)属性,它们是NSArrays。如果您设置ret为仅映射@"photos" : @"photos"@"imageUrl" : @"imageUrl"然后 RestKit 将映射所有数据,而不是映射到photo对象中。然后,如果您愿意,可以在映射完成后对这些数据进行变异...

于 2013-10-24T11:22:57.857 回答