我需要一些建议如何解决这个问题:
1)我从Web服务器检索XML。
2)我想使用核心数据在设备上本地存储来自该XML的所有实体(即Friends)。
3)所以我解析XML并为该XML中的每个朋友制作一个托管对象
4)但我想确保我不会多次将一个朋友添加到数据库中。我怎么能做到这一点?
--------------我对此的策略思考----------------
A)在解析XML时,只要有一个Friend元素启动,我就会创建一个Friend实体的Managed Object。在那一点上,我不知道它会是哪个朋友,直到NSXMLParser逐步完成所有即将到来的属性,如firstName,id等;在Friend元素的End-tag之后,我在托管对象上下文中有了这个朋友。然后我创建一个NSFetchRequest来查看该朋友是否已经存储。问题是,新朋友已经是上下文的一部分,因此Core Data可能总是返回匹配!?
B)我需要两个不同的托管对象上下文,以便解析好的朋友首先进入MOC_A,然后我查询MOC_B(实际的本地商店),而不是新解析的朋友干扰我对本地商店的查询。所以我可以知道这位朋友是否已经存在。
C)在从XML解析朋友时,我只是创建一个新的Managed Object实例,而不将其添加到托管对象上下文(可能?!)。之后,当朋友完全削减时,如果存储了Core Data,我会检查它。如果没有,我添加它。否则我扔掉了物体。
D)我需要另一种策略。
答案 0 :(得分:3)
您应该在Core Data实体中使用新的索引属性来存储XML中的唯一ID。在添加对象之前,您必须手动检查具有该ID的对象是否已存在。
<强>更新强>
关键是在确定它是新的之前不要将托管对象添加到上下文中
鉴于唯一ID,这非常简单,但听起来您无法先解析唯一ID。在这种情况下,您应该使用临时可变字典(NSMutableDictionary)来存储解析后的数据。
如果确定朋友是新朋友,则可以创建它并从字典中复制数据。如果朋友不是新朋友,你可以丢弃字典。