我正在从 Web API 将数据导入和导出到 Core Data。
我与之交互的 Web API 与自身的命名不一致,当然也不符合我在核心数据模型中用于属性的命名约定。(我无法控制更改 API 约定)。
为了说明这个问题,在一个 api 调用中,联系人的数据可能如下所示:
"rows": [
{
"name": "Bob",
"group": "Testing Group A",
"email_address" : "bob@fakedata.com"
}
]
在另一个仍然返回联系人的不同调用中,它可能看起来像这样:
"rows": [
{
"Name": "Bob",
"group_name": "Testing Group A",
"Email" : "bob@fakedata.com"
}
]
注意到键命名的细微差别了吗?过去,我通过为每个 API 调用进行“映射”来解决此类问题。映射只是一个 NSDictionary,其中包含我使用的核心数据名称的键,以及 API 服务器键的值。
因此,解决这两个调用中的每一个都需要每个调用都有一个如下所示的 NSDictionary
dict = @{ @"name" : @"name", @"group" : @"group", @"email" : @"email_address" };
dict = @{ @"name" : @"Name", @"group" : @"group_name", @"email" : @"Email" };
这工作得很好,它肯定是解决这个问题的一种途径,但是在每个 API 调用中都有这些映射不是很优雅,而且对于代码可维护性来说肯定是糟糕的设计。
所以这里真正的问题是:有没有人有更好的解决方案来管理 web api 到 Core Data 的映射?显然,编写良好的 Web API 是理想的解决方案,但即使映射编写良好的 API 也可能有细微的差别(例如,核心数据要求属性以小写字母开头)。
我提出的解决方案是将映射添加到“用户信息”下的核心数据属性中(下图查看示例),但我使用属性的此功能的经验为零,我不知道是否有办法我忽略了更好的选择。谢谢你的帮助。
附加说明:是的,我广泛使用了 Restkit,它确实有方便的映射(类似于我在上面使用 NSDictionary 解释的方式)。但是对于这个项目,我正在消除对这样一个我无法控制且不完全理解的框架的依赖。我用一个简单的 NSURLConnection 来提取这些数据。
更新 如果您沿着这条路线走(顺便说一句,这非常好,接受的答案有很大帮助)。我建议不要使用关键字“地图”,因为它不是默认值。改用“key”,因为这不需要对用户信息字段进行两次编辑。对于我的特定项目,有很多映射,这很烦人。现在改变为时已晚,但要从我的错误中吸取教训。