我正在努力使用我的第一个Core Data应用程序并且没有最顺畅的驾驶:o(
我有一个绘图应用程序,其中有一个名为DrawingObject的基类,它是NSManagedObject的子类,有两个属性:
@NSManaged var frameAsValue: NSValue
var frame: NSRect
DrawingObject有一个子类DrawingRectangle。所有都具有完全限定的类名设置的相应实体。 frameAsValue属性标记为可变形,帧标记为未定义瞬态。问题是我在创建DrawingRectangle时遇到了frameAsValue属性的无法识别的选择器错误。
我已经看到过将NSRect转换为字符串以将其保存到Core Data的建议,但这似乎容易出错(本地化)和hackish(如果那是一个合适的词; o)。这是DrawingObject的代码:
class DrawingObject: NSManagedObject {
@NSManaged var frameAsValue: NSValue
var frame: NSRect = NSZeroRect {
didSet {
frameAsValue = NSValue(rect: frame)
}
}
override func awakeFromInsert() {
frame = NSMakeRect(0, 0, 0, 0)
}
override func awakeFromFetch() {
frame = frameAsValue.rectValue
}
}
我现在假设您必须在每个实体的类层次结构中声明所有继承的属性。我现在没有时间对此进行测试,但很快就会回来。
答案 0 :(得分:0)
您必须将DrawingRectangle的父实体设置为DrawingObject才能从父实体继承属性(就像在类层次结构中一样)。如果您打算将父实体/父类的不同子类保存到相同的多对多关系中,则还必须设置父子实体关系。
例如,如果要在Drawing中的@NSManaged var objects: NSSet
中保存DrawingObjects的不同子类,则必须将实体上的父关系设置为与NSManagedObject类层次结构相对应。因此,在这种情况下,您可以将DrawingRectangle实体的父级设置为DrawingObject。
否则,NSRect将保存为问题中显示的代码,方法是将DrawingObject-entity的frame-property设置为transient和optional,将frameAsValue设置为transformable。您不应该指定一个valuetransformer,因此Core Data将使用默认值转换器,在这种情况下它可以正常工作。