Ios 使用RestKit 0.20的JSON数组进行CoreData映射?
我有一个Ios 使用RestKit 0.20的JSON数组进行CoreData映射?,ios,objective-c,restkit,restkit-0.20,Ios,Objective C,Restkit,Restkit 0.20,我有一个JSON,如下所示 { "code":0, "response":{ "Cirqit":{ "Cirqit":{...}, "Owner":{...}, "CirqitMembers":[ { "User":{...}, "CirqitMember":{...}
JSON
,如下所示
{
"code":0,
"response":{
"Cirqit":{
"Cirqit":{...},
"Owner":{...},
"CirqitMembers":[
{
"User":{...},
"CirqitMember":{...}
},
{
"User":{...},
"CirqitMember":{...}
}
]
}
}
}
我的映射代码如下:
//User mapping
RKEntityMapping *userMapping = [RKEntityMapping mappingForEntityForName:@"User" inManagedObjectStore:apiInterface.managedObjectStore];
NSDictionary *userMappingDict = @{@"id": @"id",@"firstname": @"firstname"};
[userMapping addAttributeMappingsFromDictionary:userMappingDict];
//Member Status Mapping
RKEntityMapping *membStatusMapping = [RKEntityMapping mappingForEntityForName:@"MemberStatusInfo" inManagedObjectStore:apiInterface.managedObjectStore];
NSDictionary *membStatusMappingDict = @{@"id": @"id",@"user_id": @"user_id"}; [membStatusMapping addAttributeMappingsFromDictionary:membStatusMappingDict];
//Cirqit Member Mapping
RKEntityMapping *membMapping = [RKEntityMapping mappingForEntityForName:@"CirqitMember" inManagedObjectStore:apiInterface.managedObjectStore];
NSDictionary *membMappingDict = @{ @"CirqitMember.id":@"id" };
[membMapping addAttributeMappingsFromDictionary:membMappingDict];
[membMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"response.Cirqit.CirqitMembers.User" toKeyPath:@"memberStatus" withMapping:userMapping]];
[membMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"response.Cirqit.CirqitMembers.CirqitMember" toKeyPath:@"memberDetails" withMapping:membStatusMapping]];
membMapping.identificationAttributes = @[@"id"];
//Cirqit Mapping
RKEntityMapping *cirqitMapping = [RKEntityMapping mappingForEntityForName:@"Cirqit" inManagedObjectStore:apiInterface.managedObjectStore];
NSDictionary *cirqitMappingDict = @{ @"response.Cirqit.Cirqit.id":@"id",
@"response.Cirqit.Cirqit.allow_invite": @"allow_invite"};
[cirqitMapping addAttributeMappingsFromDictionary:cirqitMappingDict];
[cirqitMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"response.Cirqit.CirqitMembers" toKeyPath:@"cirqitMembers" withMapping:membMapping]];
cirqitMapping.identificationAttributes = @[@"id"];
NSIndexSet *statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful);
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:cirqitMapping pathPattern:nil keyPath:nil statusCodes:statusCodes];
operation = [apiInterface getOperationWithRequest:request forResponseDescriptors:@[responseDescriptor]];
[operation start];
在这里,membMapping、cirqitMapping工作正常。但是membstatemapping、userMapping不起作用。实际上没有映射错误,但没有发生映射
下面是我的托管对象类:
@interface CirqitMember : NSManagedObject
@property (nonatomic, retain) NSNumber * id;
@property (nonatomic, retain) MemberStatusInfo *memberDetails;
@property (nonatomic, retain) User *memberStatus;
@end
添加关系映射时,映射中的键路径应该相对于容器,而不是相对于根。目前您有:
[membMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"response.Cirqit.CirqitMembers.User" toKeyPath:@"memberStatus" withMapping:userMapping]];
[membMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"response.Cirqit.CirqitMembers.CirqitMember" toKeyPath:@"memberDetails" withMapping:membStatusMapping]];
改为:
[membMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"User" toKeyPath:@"memberStatus" withMapping:userMapping]];
[membMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"CirqitMember" toKeyPath:@"memberDetails" withMapping:membStatusMapping]];
这也应适用于:
[cirqitMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"response.Cirqit.CirqitMembers" toKeyPath:@"cirqitMembers" withMapping:membMapping]];
但这可能是因为JSON的结构才起作用的…您有一个不起作用的映射吗?它做错了什么?显示您拥有的内容。RKEntityMapping*userMapping=[RKENTITYMAPPINGForEntityForName:@“用户”在managedObjectStore:managedObjectStore];[membMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@“response.Cirqit.CirqitMembers.User”tokePath:@“User”with mapping:userMapping];由于对象位于JSON数组中,因此是否存在任何问题。除此之外,所有其他映射都可以正常工作。您的
userMapping
不显示正在设置的任何映射。。。另外,如果您需要真正的帮助,请提供所有映射和响应描述符…非常感谢…[membMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@“response.Cirqit.CirqitMembers.CirqitMember”tokePath:@“memberDetails”with mapping:MembStateMapping];仍然没有映射。可能是我的逻辑错误。我来看看。你评论中的关键路径仍然是@“response.Cirqit.CirqitMembers.CirqitMember”
。它不需要在cirqitMapping
中已经处理过的所有keypath元素。对不起,我已经在我的程序中将其更正为@“CirqitMember”。但是仍然不起作用。。这只剩下rest,一切都很好。看起来映射字典在使用完整密钥路径时也有类似的问题。我发现了这个问题。”addPropertyMapping'将仅适用于一个'RKRelationshipMapping'。我先给哪一个,效果很好。