【问题标题】:Preventing duplicate NSManagedObjects防止重复的 NSManagedObject
【发布时间】:2014-03-20 13:06:34
【问题描述】:

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

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

【问题讨论】:

    标签: ios core-data


    【解决方案1】:

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

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

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

    如果数据来自某种在线服务,您几乎必须接受他们提供的数据。如果他们有重复的作者条目,你就不能可靠地做任何事情。你可以很容易地找到重复的名字,但这并不意味着他们是同一个人。

    【讨论】:

    • 那么这是否意味着书籍和作者之间不需要多对多关系,一对多就足够了?
    • 不,因为有些书有多个共同作者,当然有些人写不止一本书。
    • 确实如此,但在我的应用案例中,信息是“自上而下”呈现和导入的,在作者之前预订。因此,即使同一个作者可以写很多书,如果我不检查重复(我原来的问题),每个作者对于一本书都是独一无二的。
    • 抱歉,我之前的评论可能会让人觉得很流氓。我的意思是,在我的应用程序导入数据时,传入数据的结构化方式 (XML),书籍始终是第一位的,其次是作者,从不反过来。因此,即使我同意你的观点,有些作者可以写不止一本书,除非我找到一种方法来确定 book1 中的 John Smith 是否与 book2 中的 John Smith 相同,否则我最终会得到重复的名字。这对我来说很好。感谢您指出这一点。
    【解决方案2】:

    按照苹果 CoreData 文档中的说明使用 fetch 或 create 模式

    Core Data 没有隐式唯一算法。

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

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

    【讨论】:

      【解决方案3】:

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

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

      很遗憾,Core Data 不支持“唯一属性”(唯一键)。

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-12
          • 2010-11-09
          • 2011-04-23
          • 2010-09-12
          • 1970-01-01
          相关资源
          最近更新 更多