Json CoreData关系反复保存了两个

Json CoreData关系反复保存了两个,json,swift,core-data,entity-relationship,Json,Swift,Core Data,Entity Relationship,我有一个“列表”实体,与manny有“标记”关系。我将json中的数据保存在一处,如下所示: func saveData(contex:NSManagedObjectContext){ 中的listings.forEach(){(数据) let listingFetch:NSFetchRequest=Listing.fetchRequest() listingFetch.predicate=NSPredicate(格式:“id=%@”,“\(Int64(data.id))”) 做{ let re

我有一个“列表”实体,与manny有“标记”关系。我将json中的数据保存在一处,如下所示:

func saveData(contex:NSManagedObjectContext){
中的listings.forEach(){(数据)
let listingFetch:NSFetchRequest=Listing.fetchRequest()
listingFetch.predicate=NSPredicate(格式:“id=%@”,“\(Int64(data.id))”)
做{
let results:[列表]=尝试contex.fetch(listingFetch)
如果results.count==0{
let entity=Listing(上下文:contex)
entity.id=Int64(data.id)
entity.title=data.title
entity.name=data.name
data.tags.forEach{(tagData)位于
let tag=tag(上下文:contex)
tag.tagName=(tagData)
tag.toListing=实体
}
data.images.forEach{(galleryData)位于
let image=Gallery(上下文:contex)
image.imageName=galleryData
image.galtolisting=实体
}
试试?contex.save()
打印(“插入列表:ID:\(entity.ID);标题:\(字符串(描述:entity.Title));标记:\(字符串(描述:data.Tags));图像:\(字符串(描述:data.Images)))
}
其他的
{
让实体=结果[0]
entity.id=Int64(data.id)
entity.title=data.title
entity.name=data.name
data.tags.forEach{tagData in
let tag=tag(上下文:contex)
tag.tagName=tagData
tag.toListing=实体
}
data.images.forEach{galleryData in
let image=Gallery(上下文:contex)
image.imageName=galleryData
image.galtolisting=实体
}
试试?contex.save()
打印(“更新的列表:ID:\(entity.ID);标题:\(字符串(描述:entity.Title));标记:\(字符串(描述:data.Tags));图像:\(字符串(描述:data.Images)))
}
}将let错误捕获为NSError{
打印(“插入/更新列表时出错\(错误),\(错误.用户信息)”)
}
}
}
我的问题是,当我再次提取以更新数据时,所有的“标记”都是重复的


“列出”实体合同设置为id。

每次此行运行时:

let tag = Tag(context: contex)
您正在告诉核心数据创建一个新的
标记
。如果不想创建新的
标记
,则需要查找已存在的实例并对其进行更新。你可以这样做

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

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

data.tags.forEach{(tagData)在
让tagFetch:NSFetchRequest=Tag.fetchRequest()
tagFetch.predicate=NSPredicate(格式:“标记名=%@”,tagData)
做{
let tagresults:[Tag]=尝试contex.fetch(tagFetch)
如果tagresults.count==0{
如果tagData.count>0{
let tag=tag(上下文:contex)
tag.tagName=(tagData)
tag.toListing=实体
}
}
}
将let错误捕获为NSError{
打印(“插入/更新列表时出错\(错误),\(错误.用户信息)”)
}
}

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

如果列表已经存在,则添加json中的所有标记,而不检查该列表对象是否已经存在这些标记。此答案假设存在多对多关系,我得到的印象是OP使用的是一对多关系,尽管使用多对多
“tagName=%@”,tagData
,可能更好,这真的有效吗?tagData不是标记对象吗?是的!我没有错。json中的新标记保存在CD中。位这样我只添加不是一个完整的更新,如果标签从json中删除,它们仍然在CD中,你知道我如何才能只删除不包含的标签吗?一种方法是删除所有标签,然后添加新的标签。另一种方法是使用两个集合对象而不是数组来比较差异。