私はこのアプリを作っています。このセクションには、基本的にプレーヤーのスコアを保存および/または更新するセクションがあります。プレイヤーがまだ存在しないときは、すべてうまく動作するということです。しかし、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)")
}
}
フェッチ要求のプロパティー「returnObjectAsFaults」をfalseに設定してみてください。更新メソッドは、既存のレコードを更新するか、新しいレコードを作成していますか? – ebby94