如何在Core Data中存储非标准持久属性(例如NSRect)?

时间:2015-02-27 09:37:33

标签: macos cocoa swift core-data

我正在努力使用我的第一个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
    }
}

我现在假设您必须在每个实体的类层次结构中声明所有继承的属性。我现在没有时间对此进行测试,但很快就会回来。

1 个答案:

答案 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将使用默认值转换器,在这种情况下它可以正常工作。