iOS RestKit 实体管理器映射对象数组

Posted

技术标签:

【中文标题】iOS RestKit 实体管理器映射对象数组【英文标题】:iOS RestKit Entity Manager mapping Array of Objects 【发布时间】:2013-11-04 10:36:00 【问题描述】:

我在将对象数组映射到核心数据条目时遇到了一个奇怪的问题。

用户实体映射和objectManager代码:

RKEntityMapping *objectMapping = [RKEntityMapping mappingForEntityForName:@"User" inManagedObjectStore:[RKObjectManager sharedManager].managedObjectStore];

[objectMapping addAttributeMappingsFromDictionary:@@"id": @"user_id",
                                                    @"first_name": @"first_name",
                                                    @"middle_name":@"middle_name",
                                                    @"last_name":@"last_name",
                                                    @"phone":@"phone",
                                                    @"job_title":@"job_title",
                                                    @"roles":@"roles",
                                                    @"email":@"email",
                                                    @"created_at":@"created_at",
                                                    @"updated_at":@"updated_at",
                                                    @"avatar_urls":@"avatar_urls",
                                                    @"skills":@"skills",
                                                    @"interests":@"interests",
                                                    @"birth_date":@"birth_date"];


RKEntityMapping *userMapping = [User entityMapping];

[manager addResponseDescriptor:[RKResponseDescriptor responseDescriptorWithMapping:userMapping
                                                                            method:RKRequestMethodGET
                                                                       pathPattern:@"users/:id"
                                                                           keyPath:nil
                                                                       statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]];

[manager addResponseDescriptor:[RKResponseDescriptor responseDescriptorWithMapping:userMapping
                                                                            method:RKRequestMethodGET
                                                                       pathPattern:@"users"
                                                                           keyPath:nil
                                                                       statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]];

这是一个简单的用户实体数组示例。


  User1,
  User2,
  User3

查看来自 RestKit 的调试日志,所有内容都映射到正确的值。但是当我查看最终结果时,映射数组具有正确数量的项目,但它们都是 User3。同样,数据库也有 User3。 User1 和 User2 永远不会存储在数据库中。

我一直在试图找出我哪里出错了。任何帮助表示赞赏。

更新

 [manager getObjectsAtPath:@"users"
                   parameters:@@"token":token
                      success:success failure:failure];
[

    "avatar_urls": 
        "large": "",
        "medium": "",
        "small": "",
        "thumb": "",
        "icon": ""
    ,
    "id": 631,
    "roles": [
        "company_admin"
    ],
    "created_at": "2013-10-23T15:59:06.256-05:00",
    "updated_at": "2013-10-27T16:51:31.947-05:00",
    "skills": [],
    "interests": [],
    "birth_date": null,
    "phone_message_channel": true,
    "email_message_channel": true,
    "first_name": "User",
    "last_name": "One",
    "email": "",
    "phone": null,
    "job_title": null

,

    "avatar_urls": 
        "large": "",
        "medium": "",
        "small": "",
        "thumb": "",
        "icon": ""
    ,
    "id": 633,
    "roles": [
        "company_admin"
    ],
    "created_at": "2013-10-23T16:07:46.472-05:00",
    "updated_at": "2013-10-27T16:51:26.148-05:00",
    "skills": [],
    "interests": [],
    "birth_date": null,
    "phone_message_channel": true,
    "email_message_channel": true,
    "first_name": "User",
    "last_name": "two",
    "email": "",
    "phone": "",
    "job_title": ""

,

    "avatar_urls": 
        "large": "",
        "medium": "",
        "small": "",
        "thumb": "",
        "icon": ""
    ,
    "id": 632,
    "roles": [
        "company_admin"
    ],
    "created_at": "2013-10-23T16:07:12.295-05:00",
    "updated_at": "2013-11-01T20:11:26.607-05:00",
    "skills": [],
    "interests": [],
    "birth_date": "",
    "phone_message_channel": true,
    "email_message_channel": true,
    "first_name": "User",
    "last_name": "Three",
    "email": "",
    "phone": "",
    "job_title": ""
 

]

重申成功块映射结果显示数组中有3个项目,都是User 3。我还检查了核心数据并确认它只为User模型添加/更新了一行。

修复 自己没有积分来发布答案..所以添加为更新

我忘记为我的用户模型添加标识属性。一旦我将其设置为我的 ID,一切都会像魅力一样发挥作用..... =.= 剥夺睡眠是不好的......

【问题讨论】:

展示一些真实的 JSON 以及你是如何发出请求的。 【参考方案1】:

在上面的代码中,您设置了一个名为 objectMapping 的 RKEntityMapping。然后你设置另一个名为 userMapping 的RKEntityMapping。您不再引用objMapping。

您发布的代码中缺少某些内容,或者从未使用过 objectMapping,并且您没有为您的请求设置映射。

【讨论】:

你是对的,我只是输入所有相关信息而不是整个代码。但是我确实找到了解决方法.....我忘记为我的用户模型设置 IdentificationAttributes ......这就是我前一天晚上不睡觉的结果...... 根据您使用的 RestKit 版本应该自动设置它,但设置 IdentificationAttributes 总是一个好主意 我正在使用提供的最新款 cocoapods,你是对的,安全总比后悔好。我在一行代码上浪费了很多时间 =/

以上是关于iOS RestKit 实体管理器映射对象数组的主要内容,如果未能解决你的问题,请参考以下文章

使用 RestKIt 在核心数据实体中映射 json 对象

RestKit 对象映射 - 一个实体,两个映射

使用 RestKit 将 JSON“关联数组”映射到 CoreData

Restkit 对象映射给出空对象

RestKit - 实体映射属性转换

RestKit 2.0:映射-非唯一时的第二个实体为零