Ios 行的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

我正在学习如何使用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()
    }
}
但是我的程序从来没有在这里运行过。在我的课堂上没有其他的插页可以完成


有人能给我一些建议吗?

我觉得这个建议很有帮助: 因此,我在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()
    }
}