我正在努力从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服务器密钥的值。
因此解析这两个调用中的每一个都需要每个调用都有一个像以下
的NSDictionarydict = @{ @"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来提取这些数据。
更新 如果你沿着这条路走下去(顺便说一下,接受的答案很有帮助)。我建议不要使用关键词“map”,因为它不是默认值。请改用“密钥”,因为这不需要对用户信息字段进行两次编辑。对于我的特定项目,有许多映射,这很烦人。现在改变太晚了,但要从错误中吸取教训。
答案 0 :(得分:2)
您建议的方法或多或少是我处理它的方式。但是,我没有使用多个mapX
键,而是使用单个map
键,其值是以逗号分隔的映射列表。在这种情况下,密钥map
的值为Company,Company_Name,company
。这样你就可以读取一个已知密钥,而不是反复测试以查看下一个密钥是否存在。您可以使用NSString
的{{1}}方法轻松地将逗号分隔的列表转换为数组。
另一种方法是将所有这些放在您可以在运行时读取的属性列表中。这将是有效的,但我更喜欢将所有信息保存在一个地方,而用户信息字典是理想的。
另外,对于它的价值,Core Data不要求属性名称以小写字母开头。但是,Xcode的数据模型编辑器确实强制执行该限制 - 强制您遵循您可能导致违反的准则。如果您愿意,可以手动编辑模型文件,并将属性名称更改为以大写字母开头。该文件是XML,如果工具兼容性设置是Xcode 4.0或更高版本,则非常容易阅读。一旦你这样做,你甚至可以使用Xcode的内置类生成与这些属性。