【问题标题】:CoreData with Relationships - how to avoid duplicate updatesCoreData 与关系 - 如何避免重复更新
【发布时间】:2021-01-10 11:20:08
【问题描述】:

我的 CoreData 具有简单的关系,如下所示。一个具有 4 个属性的实体 Word 和一个具有一对多关系的 Chapter 实体(每个单词只出现在一个章节中,并且章节包含多个单词)。当我尝试导入包含单词列表和相关章节的文件时,会创建尚未在数据库中的章节(这是我想要的),但已经存在的章节是第二次创建的(新的相同条目在核心数据)。我可以在 xcdatamodel 中激活一个选项来检查和避免关系实体上的重复条目吗?

代码详情 ->

fileprivate func saveAllWords(_ items: [(name: String, definition: String, example: String, chapter: String)]?) {
    
            for item in items! {
        
        let newWord = Word(context: self.context)
        
        newWord.name = item.name.trimmingCharacters(in: .whitespaces)
        newWord.definition = item.definition.trimmingCharacters(in: .whitespaces)
        newWord.example = item.example.trimmingCharacters(in: .whitespaces)
        newWord.option = 10     // option tag indicating that it's a new entry from external fileI generate a classic word

     // 
         let myNewChapter = Chapter(context: self.context)
         myNewChapter.name = item.chapter
            
         newWord.chapter = myNewChapter
    }
            
    ……


// Save the data in Core Data
    do {
        try self.context.save()
    }
    catch {
    }

任何建议如何实施此唯一性约束来解决我的重复问题?

【问题讨论】:

  • 您正在寻找的特征称为唯一性约束。如果没有看到您的代码,很难说如何将其应用于您的案例。
  • 感谢您的回复,如您所见,我附上了代码,我猜您拥有与此问题相关的所有主要代码。
  • @pbasdf,或其他任何知道的人:请您看看我的代码并告诉我遵循您提到的唯一性约束缺少什么?

标签: core-data


【解决方案1】:

您必须为唯一属性创建一个约束。看起来您希望 Chapter 的名称是唯一的

在您的 xcdatamodeld 中选择您的属性,然后右约束并添加它们的属性。

最后但并非最不重要的一点是,您必须为您的上下文添加合并策略,这很可能是在您的 AppDelegate 中。有不同的合并策略。您应该检查它们最适合您的需求

context.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-28
    • 2010-09-23
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    • 2020-11-15
    相关资源
    最近更新 更多