【问题标题】:How to store a non-standard persistent attribute in Core Data (ex. NSRect)?如何在 Core Data(例如 NSRect)中存储非标准的持久属性?
【发布时间】:2015-02-27 09:37:33
【问题描述】:

我正在为我的第一个 Core Data 应用程序而苦苦挣扎,并且没有最顺畅的旅程 :o(

我有一个绘图应用程序,它有一个名为 DrawingObject 的基类,它是 NSManagedObject 的子类,并且有两个属性:

@NSManaged var frameAsValue: NSValue
var frame: NSRect

DrawingObject 有一个子类 DrawingRectangle。都有相应的实体,并设置了完全限定的类名。 frameAsValue 属性被标记为可变形,而 frame 被标记为未定义瞬态。问题是我在创建 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
    }
}

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

【问题讨论】:

标签: macos cocoa swift core-data


【解决方案1】:

您必须将 DrawingRectangle 的父实体设置为 DrawingObject 才能从父实体继承属性(就像在类层次结构中一样)。如果您打算将父实体/父类的不同子类保存到相同的一对多关系中,则还必须设置父子实体关系。

例如,如果您想在绘图中的@NSManaged var objects: NSSet 中保存不同的绘图对象子类,则必须将实体上的父关系设置为与您的 NSManagedObject 类层次结构相对应。因此,在这种情况下,您可以将 DrawingRectangle 实体的父级设置为 DrawingObject。

否则,通过将 DrawingObject-entity 的 frame-property 设置为 transient 和 optional 并将 frameAsValue 设置为可转换,将 NSRect 保存为问题中显示的代码。您不应该指定 valuetransformer,因此 Core Data 将使用在这种情况下完美运行的默认 value 转换器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    相关资源
    最近更新 更多