如何在 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?