我正在尝试使用CoreData将收藏夹按钮添加到我的应用程序中。
我有tableView并在其中添加了收藏夹按钮,当我按该特定行时可以保存标签。我成功保存了。但是我只想为该特定行填充一次CoreData。
var checkFav = [Fav]()
我创建了一个类型为Fav的数组,这是我为CoreData填充的类的类的名称,我必须检查它们是否仅出现一次。
let result = try context.fetch(Fav.fetchRequest())
checkFav = result as! [Fav]
if checkFav.isEmpty{
let fav = Fav(context: context)
fav.name = name
appDelegate.saveContext()
}
在上面您看到我填充了阵列。
do{
let result = try context.fetch(Fav.fetchRequest())
checkFav = result as! [Fav]
if checkFav.isEmpty{
let fav = Fav(context: context)
fav.name = name
appDelegate.saveContext()
}
else{
let checkName = array[rowSelected]
for value in checkFav{
if value.name == checkName{
print("You already have this name ")
}
else {
let fav = Fav(context: context)
fav.name = name
appDelegate.saveContext()
}
}
}
} catch{
print("Error")
}
假设我们在CoreData中有两个名称“ john”,“ martha”,如果我按“ martha”的按钮,则不应再次添加。但是由于我的循环,当它在数组中看到“ john”时,它认为此名称不匹配,因此将“ martha”(同名)保存到CoreData中。
我如何检查包含即将出现的名称的checkFav数组(如果包含的话)不要再次保存。但是,如果没有,请添加到CoreData中。我真的很困惑。
答案 0 :(得分:0)
如果要保存多个记录,则无法使用检查空实体的方法。
在获取请求中添加一个谓词,并将结果限制为1以检查特定名称。
此方法将名称作为参数,如果名称不存在,则添加一条记录。如果添加了条目,则返回true
,否则返回false。此外,它传递了潜在的错误。
func addFavorite(for name : String) throws -> Bool {
let request : NSFetchRequest<Fav> = Fav.fetchRequest()
request.predicate = NSPredicate(format: "name = %@", name)
request.resultsLimit = 1
if let _ = try context.fetch(request).first {
return false // record exists
} else {
let fav = Fav(context: context)
fav.name = name
appDelegate.saveContext()
return true // record added
}
}