ios - 行的 CoreData 更新导致空行的插入

标签 ios swift core-data swift3

我正在学习如何使用 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()
    }
}

一步一步:

  1. 打开应用。

  2. 用 test1 填充 settingNameLabel。

  3. 点击获取按钮。

  4. 值出现在各自的文本字段中。这是更新前数据库的截图:

before update

  1. 将settingValueLabel.text中的值改为test999。

  2. 点击保存。

  3. 如以下屏幕截图所示 - 值已更改,但应用添加了空行(第 1 行)。

after update

我在这里设置了断点:

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/

相关文章:

ios - Core Data deleteObject 将所有属性设置为 nil

ios - 在Xcode中添加Firebase时如何解决 "duplicate symbol"

ios - swift 火力地堡 : Update specific objects resulting from Firebase query

ios - OSX/iOS Preview 与 SpreadsheetML (.xlsx) 的兼容性

ios - Iphone - 使用 Swift 在 GIF 上叠加文本

objective-c - 在 Swift 中使用 Objective-C 枚举

ios - Parse - 如何在更多数据添加到解析数据库时更新 tableView?

ios - UITableView 分页 - 底部刷新以在 Swift 中加载新数据

ios - XCode - 如何重命名核心数据 xcdatamodeld 模型内部?

swift - 如何正确使用查询生成 token ?