我正在制作这个应用程序,这部分基本上可以保存和/或更新玩家的分数。事情就是当玩家还不存在时,一切都运转正常。但是当我尝试通过更改玩家的分数,同时将其下拉到NSManagedObject中然后再次保存在核心数据上时,由于某种原因,对于每个更新的记录,正在创建一个具有NULL值的新分数。我正在尝试分析我的代码但到目前为止没有成功。有谁有任何线索?提前致谢。有保存/更新的功能:
func save(player:Player){
//this var will hold the fetched data from Core Data
var people : [NSManagedObject] = []
//tell whether data was fetched from Core Data or not
var hasPlayers = false
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else{
return
}
let managedContext = appDelegate.persistentContainer.viewContext
let fetchRequest =
NSFetchRequest<NSManagedObject>(entityName: "Person")
//filter for fetchRequest
let predicate = NSPredicate(format: "name = %@", player.name)
fetchRequest.predicate = predicate
do {
people = try managedContext.fetch(fetchRequest)
} catch let error as NSError {
print("Could not fetch. \(error), \(error.userInfo)")
}
let entity = NSEntityDescription.entity(forEntityName: "Person", in: managedContext)!
let person = NSManagedObject(entity: entity, insertInto: managedContext)
//check is data was fetched
if !people.isEmpty{
hasPlayers = true
}
if !hasPlayers{
//create player in Core Data if it doesn't exist yet
person.setValue(player.name, forKey: "name")
person.setValue(player.score.total, forKey: "score")
}else{
//update player score if player already exist
for p:NSManagedObject in people{
if p.value(forKey: "name") as! String == player.name{
p.setValue(player.score.total, forKey: "score")
print("Updated: Name:\(p.value(forKey: "name") as! String) Score:\(p.value(forKey: "score") as! Int)")
}
}
}
do {
try managedContext.save()
} catch let error as NSError {
print("Could not save. \(error), \(error.userInfo)")
}
}
答案 0 :(得分:3)
您每次都在创建一个新实体,即使已经存在。将行let person = NSManagedObject(entity: entity, insertInto: managedContext)
移到if !hasPlayers
内,只有在您还没有人时才创建该行。