删除核心数据中的重复对象(iphone)

时间:2009-10-06 20:31:51

标签: iphone objective-c core-data nspredicate

在我的iPhone应用程序中,我向用户提供行业新闻视图。我从服务器获取此列表作为xml文件。解析并将xml数据插入到我的Core Data存储库中是没有道理的,但在某些情况下我可能会获得重复的新闻条目。

我认为一个好的解决方案是在处理xml Feed时插入所有更新,然后删除所有重复项。但我无法弄清楚如何做后者。如何在Apple的Core Data框架中删除重复的对象?

为了使这个具体,让我说我有一个新闻项目:

新闻项目 - uniqueId(由外部系统设置) - 标题 - newsText

有没有简洁的方法告诉Core Data只删除重复的对象,其中重复的对象被定义为具有相同“uniqueId”的对象?即,没有在我的代码中进行显式提取,并且如果已经存在同一个“uniqueId”的对象,则确保不插入对象?

2 个答案:

答案 0 :(得分:8)

核心数据不支持删除“重复”,因为对象标识的唯一概念是分配给每个对象的NSManagedObjectID。由于您无法手动设置此ID,因此无法在插入时将其用于唯一性。你有(至少)两个选择:

  1. 按照建议对插入进行抓取。测试将揭示这是否太慢:但是在测试之前,不要认为此解决方案不起作用。您可以通过将所有插入到NSInMemoryPersistentStore然后将此持久性存储迁移到永久(磁盘上)存储来进行保存来提高性能。如果您可以将所有插入的对象保留在内存中,那么非常快。

  2. 您可以插入所有对象,保存,然后执行提取并删除除一个对象之外的所有对象。同样,这可能比您怀疑的更有效。

  3. 在这两种情况下,代码量都很小。 Instruments.app中的核心数据工具将是判断两种方法性能的最佳工具。

答案 1 :(得分:0)

如果在Core Data UNIQUE中创建属性uniqueId并且不是可选的,那么它将不会再次复制相同的项目。