ios - 使用 RestKit 0.20 与 JSON 数组的 CoreData 映射?

标签 ios objective-c restkit restkit-0.20

我有一个 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 工作正常。但是 membStatusMapping,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 的结构而起作用......

关于ios - 使用 RestKit 0.20 与 JSON 数组的 CoreData 映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17278178/

相关文章:

ios - 在 Swift 中处理未捕获的异常 valueForUndefinedKey

ios - Restkit 2.0 取消——使用它有什么隐藏的问题吗?

ios - 我可以在不下载的情况下将 iOS 模拟器从旧版 Xcode 6.4 添加到新版 Xcode 7 吗?

iphone - 向 UINavigationController 中的所有 View Controller 添加相同的按钮

ios - MMDrawerController实例化

iphone - 存储大量音频资源

ios - 在 iOS 中通过 ipv4 而不是 ipv6 路由网络

ios - RD 客户端 POST 方法和特殊字符

xcode - 在设备上测试iOS应用程序时出现RestKit错误

ios - 如何读取 Firebase 快照并将特定的键值对存储在通用数组中?