策略问题:从 XML 检索数据以更新本地 Core Data DB?

Posted

技术标签:

【中文标题】策略问题:从 XML 检索数据以更新本地 Core Data DB?【英文标题】:Strategy problem: Retrieving data from XML to update local Core Data DB? 【发布时间】:2010-02-12 10:06:45 【问题描述】:

我需要一些建议:

1) 我从 Web 服务器检索 XML。

2) 我想使用 Core Data 将来自该 XML 的所有实体(即朋友)本地存储在设备上。

3) 所以我解析 XML 并为该 XML 中的每个朋友创建一个托管对象

4) 但我想确保我不会多次将一位朋友添加到数据库中。我怎样才能做到这一点?

-------------我对此的策略想法----

A) 在解析 XML 时,只要有 Friend 元素启动,我就会创建 Friend 实体的托管对象。那时我不知道它会是哪个朋友,直到 NSXMLParser 遍历所有即将出现的属性,如 firstName、id 等;在 Friend 元素的 End-tag 之后,我的 Managed Object Context 中有那个朋友。然后我发出一个 NSFetchRequest 来查看那个朋友是否已经被存储了。问题是,新朋友已经是上下文的一部分,所以 Core Data 可能总是会返回一个匹配项!?

B) 我需要两个不同的托管对象上下文,以便解析的好友首先进入 MOC_A,然后我查询 MOC_B(实际的本地存储),而新的已解析好友不会干扰我对本地存储的查询。这样我就可以知道这个朋友是否已经存在了。

C) 在从 XML 解析朋友时,我只是创建了一个新的托管对象实例,而不将其添加到托管对象上下文中(可能?!)。后来,当朋友完全pares时,我检查Core Data是否存储。如果没有,我添加它。否则我把这个东西扔掉。

D) 我需要另一种策略。

【问题讨论】:

您已经以不同的方式多次问过这个问题。答案是在 Core Data 实体中使用新的索引属性来存储 XML 中的唯一 ID。在添加对象之前,您必须手动检查具有该 ID 的对象是否已存在。 可能我以不同的方式问这个问题,因为到目前为止我还没有得到任何有用的答案。这个也没什么用。我不知道你想说什么。请详细一点。就像我问的那样(并且更新得到了答案),问题是我的新解析对象存在于上下文中,因此查询核心数据可能会导致匹配。请在投反对票之前完整阅读我的问题。 现在您已经添加了新信息,这更有意义。但是,您也可以将此信息添加到其他任何一个问题中。 也许我应该这样做。对不起。你是对的。 【参考方案1】:

您应该在 Core Data 实体中使用新的索引属性来存储 XML 中的唯一 ID。在添加对象之前,您必须手动检查具有该 ID 的对象是否已存在。

更新 关键是在确定它是新的之前不要将托管对象添加到上下文中。 考虑到唯一 ID,这非常简单,但听起来您不能先解析唯一 ID。在这种情况下,您应该使用临时可变字典 (NSMutableDictionary) 来存储解析后的数据。 如果您确定朋友是新朋友,您可以创建它并从字典中复制数据。如果朋友不是新朋友,您可以丢弃字典。

【讨论】:

好吧,你还没有真正回答:问题是托管对象是在 NSXMLParser 匹配新对象的开头时立即创建的,因此 MO 直接进入托管对象语境。然后,问题仍然悬而未决:如果它已经存在于上下文中,我怎么能:a)安全地查询核心数据(如果存在,在上下文中!所以我总是得到匹配,不是吗? ), b) 如果该对象的种类已>已存储 我已经根据新信息更新了我的答案。理想情况下,您可以先解析唯一 ID 并立即执行检查。如果这不可能,我建议使用临时字典。如果您对此方法有任何疑问,请告诉我。 感谢您的更新,伙计。现在这是有道理的:)。好的,可以说我不能在解析器进入 MOC 后立即将其添加到 MOC 中。我不能只为该托管对象实例化自定义类,比如“朋友”,然后根据需要填充属性吗?我看到的一个问题是属性是“动态的”,我相信 Core Data 创建了这些。但在那种情况下,Core Data 一开始不会做任何事情,所以我不能将该类用于临时对象,除非我对其进行深入修改-> 我可以在不中断 Core Data 的情况下修改它吗?我可以添加实例变量吗? 补充:我想说的是:我可以为我的“朋友”实体使用自定义类,而不是用字典复制数据结构吗?在解析完成之前使用 Friend 类进行临时数据存储对我来说是有意义的,并且我能够确定它是否已经存在于 Core Data 中。如果没有,那么我通过复制临时对象中的所有值来创建一个新的 MOC,否则我只是将临时对象扔掉。当然,如果另一种方法效果不佳,您的字典方法也可以。好主意。 不幸的是,实例化托管对象子类的唯一方法是将其插入上下文中。所以字典是我所知道的最好的方法。您还可以创建一个 NSObject 的子类,其中包含 ivars 和与您的 Friend 类相同的属性,并将其用于临时对象而不是字典。

以上是关于策略问题:从 XML 检索数据以更新本地 Core Data DB?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 c# 从标签之间的 XML 检索数据?

以编程方式从 android 中的 manifest.xml 检索权限

如何按照我们设置的顺序从本地存储中检索数据

从 CloudKit 检索新数据后更新 tableView 数据

如何使用更新的数据刷新 NSManagedObject - Core Data

同源策略、Javascript/jQuery AJAX 和检索 RSS XML 提要