我正在学习如何使用 CoreData 并遇到了以下问题。
我已经创建了这个应该更新现有行或插入新行的函数。但是当我尝试更新现有的时,应用会插入空白行。
这是我的部分代码:
func saveSettingToDatabase()
{
guard settingNameLabel.text != nil else {return}
let context = AppDelegate.viewContext
let tableContext = SettingsTable(context: context)
// Get record if already exists
let request: NSFetchRequest<SettingsTable> = SettingsTable.fetchRequest()
let searchString = settingNameLabel.text!
request.predicate = NSPredicate(format: "settingName = %@", searchString)
let fetchResult = try? context.fetch(request)
//If record exists, update it. Else - insert.
if fetchResult?.count == 1 {
let change = fetchResult?[0]
change?.setValue(settingNameLabel.text, forKey: "settingName")
change?.setValue(settingValueLabel.text, forKey: "settingValue")
change?.setValue(booleanValueSwich.isOn, forKey: "booleanValue")
try? context.save()
} else
{
tableContext.settingName = settingNameLabel.text
tableContext.settingValue = settingValueLabel.text
tableContext.booleanValue = booleanValueSwich.isOn
context.insert(tableContext)
try? context.save()
}
}
一步一步:
打开应用。
用 test1 填充 settingNameLabel。
点击获取按钮。
值出现在各自的文本字段中。这是更新前数据库的截图:
将settingValueLabel.text中的值改为test999。
点击保存。
如以下屏幕截图所示 - 值已更改,但应用添加了空行(第 1 行)。
我在这里设置了断点:
context.insert(tableContext)
但是我的程序从来没有到这里。而且我的课上没有其他插入可以完成。
请问有人可以建议吗?
最佳答案
我发现这个建议非常有用:Swift Core Data adding extra empty row 所以我在我的 SettingsTable 类中实现了 awakeFromInsert 函数。调试后我可以看到插入是在这里启动的:
let tableContext = SettingsTable(context: context)
我已将此行移到 else 语句中,现在它可以正常工作了。
func saveSettingToDatabase()
{
guard settingNameLabel.text != nil else {return}
let context = AppDelegate.viewContext
// Get record if already exists
let request: NSFetchRequest<SettingsTable> = SettingsTable.fetchRequest()
let searchString = settingNameLabel.text!
request.predicate = NSPredicate(format: "settingName = %@", searchString)
let fetchResult = try? context.fetch(request)
//If record exists, update it. Else - insert.
if fetchResult?.count == 1 {
let change = fetchResult?[0]
change?.setValue(settingNameLabel.text, forKey: "settingName")
change?.setValue(settingValueLabel.text, forKey: "settingValue")
change?.setValue(booleanValueSwich.isOn, forKey: "booleanValue")
try? context.save()
} else
{
let tableContext = SettingsTable(context: context)
tableContext.settingName = settingNameLabel.text
tableContext.settingValue = settingValueLabel.text
tableContext.booleanValue = booleanValueSwich.isOn
context.insert(tableContext)
try? context.save()
}
}
经过一些重构,这个函数看起来更清晰了:
func saveSettingToDatabase()
{
let context = AppDelegate.viewContext
// Get record if already exists
let request: NSFetchRequest<SettingsTable> = SettingsTable.fetchRequest()
request.predicate = NSPredicate(format: "settingName = %@", settingNameTextField.text!)
let fetchResult = try? context.fetch(request)
//If record exists, update it. Else - insert.
if fetchResult?.count == 1 {
let change = fetchResult?[0]
change?.settingName = settingNameTextField.text
change?.settingValue = settingValueTextField.text
change?.settingBooleanValue = settingBooleanValueSwitch.isOn
try? context.save()
} else
{
let addRecord = SettingsTable(context: context)
addRecord.settingName = settingNameTextField.text
addRecord.settingValue = settingValueTextField.text
addRecord.settingBooleanValue = settingBooleanValueSwitch.isOn
context.insert(addRecord)
try? context.save()
}
}
关于ios - 行的 CoreData 更新导致空行的插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43940562/