xcode 核心数据无法将可选类型的值分配给类型实体

xmjla07d  于 2023-08-07  发布在  其他
关注(0)|答案(1)|浏览(79)

在我下面的代码中,每次按下按钮时,变量数字都会增加10。我想覆盖旧的号码,然后保存,获取并显示在视图上。不幸的是,我在func fetchStats()中得到以下错误消息:如何将可选类型分配给类型实体?或者更容易说:我如何用旧的变量覆盖现有的变量“number”,然后保存,用核心数据获取它(到具有属性(值)的实体(Statsohs)),最后显示它?

import UIKit
import CoreData

class ViewController: UIViewController {

    var number : Double = 0
    
    //Reference to Managed Object Context
    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    
    //Data for the Stats
    var average : Statsohs?

    @IBOutlet weak var LabelStats: UILabel!
    //--------------------------------------------------------------------------------------
    override func viewDidLoad() {
        super.viewDidLoad()

        fetchStats()
        
    }
//--------------------------------------------------------------------------------------
    @IBAction func ActionButton(_ sender: UIButton) {

        number = number + 10
        
        average = Statsohs(context: context)
        average?.value = number
        LabelStats.text = String(format: "%.2f", average!.value)
        
        //Save the data
                do {
                    try context.save()
                            
                }
                    catch {
                            
                }
        
    }
//--------------------------------------------------------------------------------------
    func fetchStats() {
        
            //Fetch the data from CoreData to display in the View
            do {
                average = try context.fetch(Statsohs.fetchRequest())
                   //Cannot assign value of type '[Statsohs]' to type 'Statsohs'
            }
            catch {
                
            }
        }
    
}

字符串
我在一开始尝试了不同的平均值声明,例如:平均值:[Statsohs]?但是,我将在平均值= Statsohs(conext:context)并且类型“[Statsohs]”的成员也没有成员“value”
我希望它有可能以这种方式分配值到Statsohs,保存,获取,显示每次更新的值。

ffx8fchx

ffx8fchx1#

fetch始终返回记录数组(多个项目),即使只有一个记录。
若要覆写记录的属性,您必须撷取记录、修改属性并将其存回。
fetchStats中,提取数组中第一个记录(单个)。将其分配给average,并将其value分配给number。如果不存在,则创建一个并将零分配给value

func fetchStats() {
        //Fetch the data from CoreData to display in the View
     do {
        if let found = try context.fetch(Statsohs.fetchRequest()).first {
            average = found
            number = found.value
        } else {    
            average = Statsohs(context: context)
            average?.value = 0
            saveData()
        }
        displayData()
            
    } catch {
        print(error)
    }
}

字符串
actionButton中,将number递增10,将结果赋值给value,显示并保存数据

@IBAction func actionButton(_ sender: UIButton) {
    number += 10.0
    average?.value = number
    saveData()
    displayData()
}


最后添加helper方法displayDatasaveData

func saveData() {
    do {
        try context.save()       
    } catch {
        print(error)              
    }

}

func displayData() {
    labelStats.text = String(format: "%.2f", number)
}

相关问题