Core Data 对我手动编写的 @NSManaged 属性做了什么。我得到实体而不是键值赞美

What is Core Data doing with my manually written @NSManaged properties. I get the entity not key value compliment

在核心数据中,我将我的实体设置为 Category/Extension 模式。

在我的 xdatamodel 视图中,我创建了一些属性和关系。

我试图将另一个 属性 添加到我生成的实体文件之一,但是当我创建一个新对象时我似乎无法访问这个 属性。

这是我的例子:

我知道 Core Data 为我的对象生成了一个字符串 属性,我们就这样称呼它为汽车对象吧。

import Foundation
import CoreData

Extension Car {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Sellable>

    @NSManaged public var name: String?

}

很简单吧?我没有创建那个文件,但我知道这是 CoreData 自动生成的。

现在,当我尝试编写 "Car+CoreDataClass.swift" 以在下面添加一个 属性 时:

import Foundation
import CoreData


@objc(Car)
public class Car: SomeParentClassThatInheritsFromNSManagedObject {

@NSManaged var nameTest: String?

}

我无法使用 someCarInstance.setValue("End of Line buddy!", forKey: "nameTest")

设置实例的 属性 值

我在使用 setValue 函数时遇到此错误:

由于未捕获的异常 'NSUnknownKeyException',正在终止应用程序,原因:'[setValue:forUndefinedKey:]:实体 Car 不符合键 "nameTest" 的键值编码。'

这是我用 someCarInstance.nameTest = "You too buddy." 的面向对象方式得到的错误:

由于未捕获的异常 'NSInvalidArgumentException' 而终止应用程序,原因:'-[Car setNameTest:]: 无法识别的选择器发送到实例 0x6080000aeb20'(注意这里,我创建了一个 NSManagedObject 并且必须将 is 转换为 Car entity 来获取面向对象的功能和命名约定。所以 CoreData 确实看到了它,但它没有管理它。

这是绝对不应该做的事情吗?为什么?最初,我试图在我的父级(超级)class 中创建此 属性,但如您所见,我直接在 class 本身中对其进行了测试,但我得到了相同的错误。这是 CoreData 不应该在我的 Car class 文件中查找 @NSManaged 属性的东西吗?在我看来,这应该有效。

通常会出现这种情况,因为它自己的代码没问题,但核心数据容器/SQLite table 已经在您的开发机器上创建,没有新实体。尝试删除 ~/Library/Application Support/ 你的应用程序名称 中的任何内容,然后再次 运行 它。

如果您有 @NSManaged 属性,则 属性 必须 在托管对象模型中声明。

@NSManaged 你是说这个 属性 将由 Core Data 管理。 Core Data 无法做到这一点,除非它知道 属性。它不知道 属性 除非它在托管对象模型中。

如果你想让它由 Core Data 管理,你需要将它添加到数据模型中。

如果您不希望它由 Core Data 管理,请删除 @NSManaged

但是——正如您所发现的——您不能只声明它是 @NSManaged,除非您将它包含在数据模型中。