CoreData关系保存了两个一遍又一遍

CoreData relation saved two over and over again

我有一个“列表”实体,它与带有“标签”的曼尼有关。我像这样从 json 中保存数据:

         func saveData(contex: NSManagedObjectContext) {
            
            listings.forEach() { (data) in
                   
            let listingFetch: NSFetchRequest<Listing> = Listing.fetchRequest()
              listingFetch.predicate = NSPredicate(format: "id = %@",  "\(Int64(data.id))")
                   
                do {
                 let results:[Listing] = try contex.fetch(listingFetch)
                    if results.count == 0 {

                       let entity = Listing(context: contex)
                        
                        entity.id = Int64(data.id)
                        entity.title = data.title
                        entity.name = data.name
                        data.tags.forEach { (tagData) in
                            let tag = Tag(context: contex)
                            tag.tagName = (tagData)
                            tag.toListing = entity
                            
                        }
                        data.images.forEach { (galleryData) in
                            let image = Gallery(context: contex)
                            image.imageName = galleryData
                            image.galtolisting = entity
                        }
                        
                        try? contex.save()
                        print ("Insert Listing: ID: \(entity.id); Title: \(String(describing: entity.title)); Tags: \(String(describing: data.tags)); Images: \(String(describing: data.images))")
                    }
                    else
                    {
                       let entity = results[0]
                        entity.id = Int64(data.id)
                        entity.title = data.title
                        entity.name = data.name
                        data.tags.forEach { tagData in
                            let tag = Tag(context: contex)
                            tag.tagName = tagData
                            tag.toListing = entity
                        }
                        data.images.forEach { galleryData in
                            let image = Gallery(context: contex)
                            image.imageName = galleryData
                            image.galtolisting = entity
                        }
                        try? contex.save()
                        print ("Updated Listing: ID: \(entity.id); Title: \(String(describing: entity.title)); Tags: \(String(describing: data.tags)); Images: \(String(describing: data.images))")
                        
                    }
                    
                } catch let error as NSError {
                    print("error inserting / updating Listing \(error), \(error.userInfo)")
                }
            }
      
        }

我遇到的问题是,当我再次获取更新数据时,所有“标签”都是重复的。

“列表”实体约束设置为 id。

每次运行此行时:

let tag = Tag(context: contex)

您是在告诉 Core Data 创建一个新的 Tag。如果你不想创建一个新的 Tag,你需要找到已经存在的实例并更新它们。你可以通过

  • 使用基于 tagName 的谓词获取 Tag。检查是否已存在具有该名称的 Tag。如果是这样,请更新它。如果没有,请创建一个新的。这更容易,但可能更慢。
  • 获取所有 Tag 个实例并将它们保存在字典中,其中键是 tagName。然后你可以在字典中查看是否存在必要的 Tag 并创建一个或更新你已有的。这并不难,但也不那么容易,但可能会更快。

最终..工作代码。新标签保存在旧标签之上。

           data.tags.forEach { (tagData) in
                            let tagFetch: NSFetchRequest<Tag> = Tag.fetchRequest()
                            tagFetch.predicate = NSPredicate(format: "tagName = %@",  tagData)
                            
                            do {
                                let tagresults:[Tag] = try contex.fetch(tagFetch)
                                if tagresults.count == 0 {
                                    if tagData.count > 0 {
                                        let tag = Tag(context: contex)
                                        tag.tagName = (tagData)
                                        tag.toListing = entity
                                    }
                                }
                            }
                            catch let error as NSError {
                                print("error inserting / updating Listing \(error), \(error.userInfo)")
                            }
                            
                        }

现在。如果传入更新中不存在标签,则必须找到一种方法从 CD 中删除这些标签。 EX 用户编辑了列表并删除了一些标签!