0

我在这里显示了一个核心数据关系映射:

在此处输入图像描述

这个 JSON:

{
  user: {
    rid: '1234'
    providers: {
       [
         foursquare: {
           rid: '1234'
         },
         facebook: {
           rid: '1234'
         }
       ]
    }
  }

使用此映射:

    RKEntityMapping *foursquareProviderMapping = [RKEntityMapping mappingForEntityForName:@"FoursquareProvider" inManagedObjectStore:managedObjectStore];
foursquareProviderMapping.identificationAttributes = @[@"rid"];
[foursquareProviderMapping addAttributeMappingsFromArray:@[@"rid"]];

RKEntityMapping *facebookProviderMapping = [RKEntityMapping mappingForEntityForName:@"FacebookProvider" inManagedObjectStore:managedObjectStore];
facebookProviderMapping.identificationAttributes = @[@"rid"];
[facebookProviderMapping addAttributeMappingsFromArray:@[@"rid"]];

RKEntityMapping *userMapping = [RKEntityMapping mappingForEntityForName:@"User" inManagedObjectStore:managedObjectStore];
userMapping.identificationAttributes = @[@"rid"];
[userMapping addAttributeMappingsFromArray:@[@"rid"]];
[userMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"providers.foursquare" toKeyPath:@"providers" withMapping:foursquareProviderMapping]];
[userMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"providers.facebook" toKeyPath:@"providers" withMapping:facebookProviderMapping]];

这会导致 toKeyPath:@"providers" 的多键路径映射错误

有没有正确的方法来映射这个?如果需要更改 JSON,我可以完全控制它。

4

1 回答 1

0

你可以使用 RKDynamicMapping 来解决这个问题。首先你应该改变你的 JSON。

{
user: {
rid: '1234'
providers: [
         {
         type: "foursquare"
         rid: '1234'
         },
         {
         type: "facebook"
         rid: '1234'
         }
     ]
  }
}

之后像这样使用动态映射

RKEntityMapping *foursquareProviderMapping = [RKEntityMapping mappingForEntityForName:@"FoursquareProvider" inManagedObjectStore:managedObjectStore];
foursquareProviderMapping.identificationAttributes = @[@"rid"];
[foursquareProviderMapping addAttributeMappingsFromArray:@[@"rid"]];

RKEntityMapping *facebookProviderMapping = [RKEntityMapping mappingForEntityForName:@"FacebookProvider" inManagedObjectStore:managedObjectStore];
facebookProviderMapping.identificationAttributes = @[@"rid"];
[facebookProviderMapping addAttributeMappingsFromArray:@[@"rid"]];

RKDynamicMapping *dynamicMapping = [RKDynamicMapping new];
[dynamicMapping addMatcher:[RKObjectMappingMatcher matcherWithKeyPath:@"type" expectedValue:@"facebook" objectMapping:facebookProviderMapping]];
[dynamicMapping addMatcher:[RKObjectMappingMatcher matcherWithKeyPath:@"type" expectedValue:@"foursquare" objectMapping:foursquareProviderMapping]];

RKEntityMapping *userMapping = [RKEntityMapping mappingForEntityForName:@"User" inManagedObjectStore:managedObjectStore];
userMapping.identificationAttributes = @[@"rid"];
[userMapping addAttributeMappingsFromArray:@[@"rid"]];
[userMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"providers" toKeyPath:@"providers" withMapping:dynamicMapping]];
于 2013-12-10T12:33:23.640 回答