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

Posted

技术标签:

【中文标题】如何在 Core Data(例如 NSRect)中存储非标准的持久属性?【英文标题】:How to store a non-standard persistent attribute in Core Data (ex. 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
    

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

【问题讨论】:

NSRect 不是 Core Data 模型检查器中支持的类型。您是如何定义 Core Data 属性的? 使用可转换的,因为我认为它符合 NSCoding 标准 您可以将 NSRect 转换为字符串并将其存储:developer.apple.com/library/mac/documentation/Cocoa/Conceptual/… 我不这么认为(NSRect 是一个 C 结构,而不是一个类)。看看developer.apple.com/library/mac/documentation/Cocoa/Conceptual/…,有专门针对 NSRect 的示例。 您的问题似乎与 子类 无关(在这种情况下,您应该相应地更新标题和内容)。 【参考方案1】:

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

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

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

【讨论】:

以上是关于如何在 Core Data(例如 NSRect)中存储非标准的持久属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Core Data中同步两个独立的NSManagedObjectContext?

如何在 Core Data 中存储 CLPlacemark 地址数据

Core Data 如何从实体中检索列

如何在复杂的 Core Data 模型中高效访问数据

如何组织具有循环依赖的 Core Data 实体?

如何将日期类型保存到 Swift Core Data 中实体的属性?