防止重复的NSManagedObjects

时间:2014-03-20 13:06:34

标签: ios core-data

考虑两个实体AuthorBook,这些实体属于多对多关系,从外部数据库导入到我的CoreData存储中。我感到困惑的是,我应该为每位作者创建一个新的NSManagedObject,即使这位作者已经在商店中了吗?我怎么知道两个同名的作者是同一个人?例如,我可能最终得到10个John Smiths,其中5个是同一个人,但导入数据时无法检查这个,对吧?假设我想为其中一个John Smiths做一个fetchrequest,我仍然会得到10个结果。他也可能出现在J. Smith或J.A.史密斯。但J. Smith也可能是Jenny Smith。

我应该为每位作者创建一个NSManagedObject,而不是担心可能的重复,或者还有其他解决方法吗?

4 个答案:

答案 0 :(得分:1)

使用获取或创建模式,如Apple CoreData docs

中所述

核心数据没有隐含的单一算法。

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdImporting.html

(他们称之为查找或创建);)

答案 1 :(得分:1)

为了消除人(或作者)的歧义,您需要一个“唯一”属性,比如说author_id,保证在创建作者时是唯一的。

另一种方法是使用启发式方法来确定对象是否可能重复。第二种方法听起来更复杂,实际上它更复杂;)

不幸的是,Core Data不支持“唯一属性”(唯一键)。

这两种方法都可以实现为适当的托管对象“验证”,在保存上下文时会调用它们。

复杂的解决方案将使用每个唯一属性和每个上下文维护的单独的索引。使用核心数据查询,如示例片段“有效地实现查找或创建”中所示,以确认每次保存上下文时满足“唯一约束”,对于大型数据集将变得非常慢。

答案 2 :(得分:1)

  

我怎么知道两个同名的作者是同一个人?

你不是,那就是你问题的核心所在。您需要允许重复的名称,因为名称(通常)不是唯一的。任何基于名称避免或删除重复项的技术解决方案几乎都可以保证破坏您的数据。

我们不清楚您的数据来自何处,因此很难说最佳解决方案是什么。如果这是用户输入的数据,请让用户编辑现有作者以添加或删除标题,以防止重复。提供合并两个条目的选项,以防用户意外创建副本。

如果数据来自某种在线服务,那么您几乎不得不接受他们提供的服务。如果他们有重复的作者条目,你就无法可靠地做任何事情。您可以轻松找到重复的名称,但这并不意味着他们是同一个人。

答案 3 :(得分:1)

在iOS 9中,Apple为Core Data引入了独特的约束。现在,您可以指定必须唯一的属性。