2

我正在从 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”,因为这不需要对用户信息字段进行两次编辑。对于我的特定项目,有很多映射,这很烦人。现在改变为时已晚,但要从我的错误中吸取教训。

4

1 回答 1

2

哇,这是一个搞砸的 Web API。

您建议的方法或多或少是我如何处理它。但是mapX,我没有使用多个键,而是使用一个map键,其值是逗号分隔的映射列表。在这种情况下,键map的值为Company,Company_Name,company。这样你就可以读取一个已知的密钥,而不是反复测试下一个是否存在。NSString您可以使用'方法轻松地将逗号分隔的列表转换为数组componentsSeparatedByString:

另一种方法是将所有这些放在一个属性列表中,您可以在运行时读取该列表。这将是有效的,但我更喜欢将所有信息保存在一个地方,并且用户信息字典是理想的。

顺便说一句,Core Data 并不要求属性名称以小写字母开头。然而,Xcode 的数据模型编辑器确实强制执行该限制——迫使您遵循您可能有理由违反的准则。如果您愿意,可以手动编辑模型文件并将属性名称更改为以大写字母开头。该文件为 XML,如果工具兼容性设置为 Xcode 4.0 或更高版本,则非常易于阅读。一旦你这样做了,你甚至可以使用带有这些属性的 Xcode 的内置类生成。

于 2013-01-14T19:22:19.437 回答