2017-06-12 13 views
0

私はこのアプリを作っています。このセクションには、基本的にプレーヤーのスコアを保存および/または更新するセクションがあります。プレイヤーがまだ存在しないときは、すべてうまく動作するということです。しかし、NSManagedObjectにプルダウンしてからCore Dataに再度保存したときにプレーヤーのスコアを変更して更新しようとすると、更新されたレコードごとにNULL値を持つ新しいレコードが作成されます。私は自分のコードを分析しようとしていますが、これまでは成功していません。誰か手掛かりがありますか?前もって感謝します。あなたは新しいエンティティを毎回作成しているコアデータを保存する関数は、更新しようとすると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

フェッチ要求のプロパティー「returnObjectAsFaults」をfalseに設定してみてください。更新メソッドは、既存のレコードを更新するか、新しいレコードを作成していますか? – ebby94

答えて

2

1がすでに存在する場合でも、:セーブ/更新のための機能があります。 let person = NSManagedObject(entity: entity, insertInto: managedContext)行をif !hasPlayersに移動し、まだ人がいない場合にのみ作成してください。

+0

ビンゴ!ありがとうございます。私はコアデータについて学んでいます。その行がすでにデータベース上に新しいエントリを作成していて、それを変更していなかったことがわかりませんでした。これがnull値を持つ理由です。再度、感謝します! –

関連する問題