Ios 行的CoreData更新导致插入空行
我正在学习如何使用CoreData,并面临以下问题 我创建了这个函数,它应该更新现有行或插入新行。但当我试图更新现有的应用程序时,应用程序会插入一个空行 以下是我的部分代码:Ios 行的CoreData更新导致插入空行,ios,swift,core-data,swift3,Ios,Swift,Core Data,Swift3,我正在学习如何使用CoreData,并面临以下问题 我创建了这个函数,它应该更新现有行或插入新行。但当我试图更新现有的应用程序时,应用程序会插入一个空行 以下是我的部分代码: func saveSettingToDatabase() { guard settingNameLabel.text != nil else {return} let context = AppDelegate.viewContext let tableContext = SettingsTabl
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()
}
}
但是我的程序从来没有在这里运行过。在我的课堂上没有其他的插页可以完成
有人能给我一些建议吗?我觉得这个建议很有帮助: 因此,我在SettingsTable类中实现了awakeFromInsert函数。调试后,我可以看到insert已在此处初始化:
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()
{
guard settingNameLabel.text!=nil else{return}
让context=AppDelegate.viewContext
//获取已存在的记录
let请求:NSFetchRequest=SettingsTable.fetchRequest()
让searchString=settingNameLabel.text!
request.predicate=NSPredicate(格式:“settingName=%@”,searchString)
让fetchResult=try?context.fetch(请求)
//如果记录存在,则更新它。否则-插入。
如果fetchResult?.count==1{
让更改=获取结果?[0]
更改?.setValue(settingNameLabel.text,forKey:“settingName”)
更改?.setValue(settingValueLabel.text,forKey:“settingValue”)
更改?.setValue(booleanValueSwich.isOn,forKey:“booleanValue”)
try?context.save()
}否则
{
让tableContext=SettingsTable(上下文: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()
}
}
func saveSettingToDatabase()
{
让context=AppDelegate.viewContext
//获取已存在的记录
let请求:NSFetchRequest=SettingsTable.fetchRequest()
request.predicate=NSPredicate(格式:“settingName=%@”,settingNameTextField.text!)
让fetchResult=try?context.fetch(请求)
//如果记录存在,则更新它。否则-插入。
如果fetchResult?.count==1{
让更改=获取结果?[0]
更改?.settingName=settingNameTextField.text
更改?.settingValue=settingValueTextField.text
更改?.settingBooleanValue=settingBooleanValueSwitch.isOn
try?context.save()
}否则
{
让addRecord=SettingsTable(上下文:上下文)
addRecord.settingName=settingNameTextField.text
addRecord.settingValue=settingValueTextField.text
addRecord.settingBooleanValue=settingBooleanValueSwitch.isOn
context.insert(addRecord)
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()
}
}