编辑核心数据会产生错误,此类与键的键值编码不兼容

Posted

技术标签:

【中文标题】编辑核心数据会产生错误,此类与键的键值编码不兼容【英文标题】:Editing core data produces error this class is not key value coding-compliant for the key 【发布时间】:2017-06-27 18:51:27 【问题描述】:

我是编辑核心数据的新手,很难让它为我工作,我已经按照他们文档中的示例 swift 提供但没有成功,下面是我的代码,当单击 saveButton 时,新数据应该得到保存回核心数据,但出现以下错误消息时崩溃:

'[setValue:forUndefinedKey:]: 这个类对于键 oneWeekWeight 不符合键值编码。'

    import UIKit
    import CoreData

class WeekStatsViewController: UIViewController 

    var client: Client? = nil
    var managedObjectContext: NSManagedObjectContext!

    @IBOutlet weak var dobLabel: UILabel!
    @IBOutlet weak var telephoneLabel: UILabel!
    @IBOutlet weak var emailLabel: UILabel!
    @IBOutlet weak var heightLabel: UILabel!

    @IBOutlet weak var weightTextField: UITextField!
    @IBOutlet weak var weekTextField: UITextField!

    @IBOutlet weak var neckTextField: UITextField!
    @IBOutlet weak var shouldersTextField: UITextField!
    @IBOutlet weak var chestTextField: UITextField!
    @IBOutlet weak var bicepTextField: UITextField!
    @IBOutlet weak var waistTextField: UITextField!
    @IBOutlet weak var hipsTextField: UITextField!
    @IBOutlet weak var thighTextField: UITextField!

    override func viewDidLoad() 
        super.viewDidLoad()

        managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

        // Do any additional setup after loading the view.
        navigationItem.title = client!.name
        dobLabel.text = client!.dob
        telephoneLabel.text = client!.telephone
        emailLabel.text = client!.email
        heightLabel.text = String(describing: client!.height)
    

    // Dismiss keyboard when empty space tapped
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 

        weightTextField.endEditing(true)
        weekTextField.endEditing(true)
        neckTextField.endEditing(true)
        shouldersTextField.endEditing(true)
        chestTextField.endEditing(true)
        bicepTextField.endEditing(true)
        waistTextField.endEditing(true)
        hipsTextField.endEditing(true)
        thighTextField.endEditing(true)
    

    @IBAction func saveButton(_ sender: Any) 

        let editWeight = Double(weightTextField.text!)
        let editWeek = weekTextField.text
        let editNeck = neckTextField.text
        let editShoulders = shouldersTextField.text
        let editChest = chestTextField.text
        let editBicep = bicepTextField.text
        let editWaist = waistTextField.text
        let editHips = hipsTextField.text
        let editThigh = thighTextField.text

        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Client")

        do 
            let fetchedClients = try managedObjectContext.execute(fetchRequest)

            fetchedClients.setValue(editWeight, forKey: "oneWeekWeight")
            fetchedClients.setValue(editWeek, forKey: "weekOneSelected")
            fetchedClients.setValue(editNeck, forKey: "oneWeekNeck")
            fetchedClients.setValue(editShoulders, forKey: "oneWeekShoulders")
            fetchedClients.setValue(editChest, forKey: "oneWeekChest")
            fetchedClients.setValue(editBicep, forKey: "oneWeekBicep")
            fetchedClients.setValue(editWaist, forKey: "oneWeekWaist")
            fetchedClients.setValue(editHips, forKey: "oneWeekHips")
            fetchedClients.setValue(editThigh, forKey: "oneWeekThigh")

            try managedObjectContext.save()


         catch 
            fatalError("Failed to fetch clients: \(error)")
        

    


【问题讨论】:

请检查您的插座连接,一个标签可能有 2 个连接。以前您可能已经给出了这个名称,但引用仍然存在。 肯定是我的代码不正确:( 【参考方案1】:

你的saveButton 函数有这个声明:

let moc = self.managedObjectContext

然后它会做这样的事情:

moc?.setValue(editWeight, forKey: "oneWeekWeight")

除了NSManagedObjectContext 没有名为oneWeekWeight 的属性。尝试在上下文中设置值的所有其他行都会遇到同样的问题,因为它们都不存在。

如果您有一个具有这些属性的实体,您需要有一个使用该实体创建的NSManagedObject 实例。您可以获取现有实例或创建新实例。从您的代码中不清楚您想要哪一个,但您可能知道您是在尝试创建新数据还是编辑现有数据。

【讨论】:

嗨汤姆,我在等待帮助时一直在尝试解决这个问题,当我注释掉我第一次遇到错误的那一行时,我发现你的观点完全一样。我正在尝试编辑现有数据并认为我自己很困惑:) 看起来您想使用获取请求的结果之一。不过,您可能想要添加一个 fetch 谓词,因为可能会有多个结果。 您能不能看一下我更新的代码,让我知道我在哪里出错了,我尝试过的所有操作都会导致相同的原始错误。如果你不太忙,真的很感激。谢谢 您的新代码尝试在fetchedClients 上使用相同的键,这是一个数组。您需要以某种方式获取单个实例——例如,通过从该数组中选择一个条目。您如何选择一个取决于您的应用程序需要如何工作。在您获取的所有结果中,您要更新哪一个?

以上是关于编辑核心数据会产生错误,此类与键的键值编码不兼容的主要内容,如果未能解决你的问题,请参考以下文章

使用 Restkit 0.20 映射此类与键的键值编码不兼容

将项目从情节提要更改为 xib 文件时出现“此类与键的键值编码不兼容”错误

情节提要:此类与键的键值编码不兼容

MPMediaItem 此类与键的键值编码不兼容

接口构建器问题:连接 IBOutlet 时,获取“此类与键的键值编码不兼容”

此类与键 scrollView 的键值编码不兼容