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 用户编辑了列表并删除了一些标签!
我有一个“列表”实体,它与带有“标签”的曼尼有关。我像这样从 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 用户编辑了列表并删除了一些标签!