核心数据保存功能在尝试更新时插入NULL值

时间:2017-06-12 04:34:19

标签: swift core-data

我正在制作这个应用程序,这部分基本上可以保存和/或更新玩家的分数。事情就是当玩家还不存在时,一切都运转正常。但是当我尝试通过更改玩家的分数,同时将其下拉到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)")
    }

}

1 个答案:

答案 0 :(得分:3)

您每次都在创建一个新实体,即使已经存在。将行let person = NSManagedObject(entity: entity, insertInto: managedContext)移到if !hasPlayers内,只有在您还没有人时才创建该行。