2017-05-12 29 views
1

我正在學習如何使用CoreData並面臨以下問題。該行的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

  • 變化settingValueLabel.text到test999的值。

  • 單擊保存。

  • 根據以下屏幕截圖 - 值已更改,但應用程序添加了空白行(第1行)。

  • after update

    我已經把這裏斷點:

    context.insert(tableContext) 
    

    但我的程序永遠放在這裏。而且在我的班級裏沒有其他的插頁可以完成。

    有人可以提醒嗎?

    回答

    1

    我發現這個建議很有幫助: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() 
        } 
    }