当响应包含在数组中时,RestKit POSTed 托管对象变得重复
Posted
技术标签:
【中文标题】当响应包含在数组中时,RestKit POSTed 托管对象变得重复【英文标题】:RestKit POSTed managed object becomes duplicate when response is enveloped in an array 【发布时间】:2014-07-07 20:14:02 【问题描述】:当我使用 RestKit 发布 Core Data 托管对象时,RestKit 不会更新现有对象,而是创建一个新对象。
返回的 JSON 始终包含新创建的对象,但会将其包装成复数键控数组。我发现如果我将其更改为仅一个对象,则更新将按预期进行。但是,我想将数组保留在响应中,以便所有响应始终采用复数形式。
有什么方法可以让 RestKit 更新记录,即使是从包装在数组中的服务器返回?
可能的解决方案:identificationAttribute
?
在我的实体上,我有一个名为 remoteID
的 identificationAttribute
。这是记录的主唯一键。这将在 POST 之前为 0,因为该对象尚未在服务器上。我认为通过添加第二个名为insertionID
的标识属性,在 POST 之前设置它,然后在响应中返回它,将允许 RK 在本地存储中找到现有实体。唉,没用。
但是起作用的是,在 POST 之前将 remoteID
设置为服务器上的下一个自动增量值!什么可以解释它适用于remoteID
,但不适用于第二个insertionID
?
示例请求
"user":
"email": "example@example.com"
回应
"users": [
"email": "example@example.com"
]
【问题讨论】:
【参考方案1】:我想将数组保留在响应中,以便所有响应始终采用复数形式。
您不应该这样做,因为这是单独的请求和响应,而不是组合。
您对identificationAttribute
的想法是正确的,但不适用于响应为数组的情况。数组是放弃与源对象匹配并创建新对象的触发器(或可能的触发器之一)。改变这一点很困难。
在不了解您的实际情况的情况下,2 个替代方案:
-
更改 JSON
发布一个字典而不是真实的对象,然后你就不会有重复了
当您使用多个标识属性时,必须全部匹配才能找到目标对象。
注意 - 不要为具有不同标识属性的同一实体创建多个映射,否则您很可能会长时间调试查找缓存以试图弄清楚发生了什么......
如果在发出请求之前身份匹配,则数组不是问题。更详细地解释上述内容:
当您发布一个对象时,RestKit 期望取回该对象。因此,如果您发布一个对象并返回一个数组,它不知道该怎么做,因为它无法将数组映射到一个对象。因此,它会尝试根据标识属性(如果存在)进行查找。如果 POSTed 对象没有 id 而返回的对象有,那么它将永远不会匹配。如果您在 POST 之前设置它,那么它将匹配。
【讨论】:
它可以丢弃数组,但是我需要创建额外的响应描述符。如果我想发布多个对象怎么办?当然我需要一个数组响应。当响应是数组时,RK 不使用标识属性从 Core Data 存储中获取现有实体,我觉得很奇怪。如果我还发布了一个数组,它会改变吗?我先有这个,但也没有用。 我不记得发布数组是否检查数组响应内容。如果您发布了多个对象,我通常希望收到返回的状态/ID 响应列表,而不是必然收到完整的对象。请记住,RestKit 试图迎合“规范”,您可以找到它不做的事情。你可以分叉它并建议更改(在 github 上)。 嗨,Wain,我在关于identificationAttribute
的问题中添加了一些新信息。您能否解释一下这种意外行为?
啊,所以一个额外的属性不起作用,因为 all 属性必须匹配。谢谢!
哦,天哪,我感觉前面有很多麻烦......在解决了这个问题之后,更多的问题出现了,RK 没有映射到现有的 CoreData 实体。我有三层关系嵌套,我只想发布前两层。结果:RestKit 成功映射到第一层实体,第二层实体被复制,第三层实体被孤立。有什么办法可以让它与 RK 一起工作,或者这不是要走的路?以上是关于当响应包含在数组中时,RestKit POSTed 托管对象变得重复的主要内容,如果未能解决你的问题,请参考以下文章
Restkit 映射列表 - 没有响应描述符与加载的响应匹配