核心数据和自定义属性类型
Posted
技术标签:
【中文标题】核心数据和自定义属性类型【英文标题】:Core Data and custom attribute type 【发布时间】:2017-02-24 11:06:59 【问题描述】:晚上,
我正在尝试使用 T 类型的属性 x 构建一个实体 A。
T 是我创建的枚举。
我应该如何设置 xcdatamodel 为属性使用自定义类型?
我目前的设置是:
attribute x, type: Undefined, CustomClass: T.
但我有错误:
x ....核心数据必须有一个定义的类型。
具体目的:
x 是一个“情绪”属性,可能有 3 种不同的情绪,这就是我选择枚举的原因。
【问题讨论】:
我可以知道这个自定义属性类型的具体用途吗?Transformable
应该提供您正在寻找的内容。
想想定义的类型应该是什么。它是弹出菜单中的一种类型或通过可转换的自定义类型。在 Core Data 中使用枚举的常用方法是使用计算属性将案例映射到 Int
或 String
。
@iosAppDev 这是特定目的:我有一个“情绪”属性,可能有 3 种不同的情绪,这就是我选择枚举的原因。那么我应该使用 Transofrmable 吗?
@vadian 我明白你的意思,但我不知道怎么解释,你能解释得更好吗?
【参考方案1】:
CoreData 中有一个名为 Transformable
的类型,专门用于处理本机不支持的类型。
基本上,这种类型会帮助您在将不支持的类型存储到数据库之前将其自动序列化为Data
对象,并在检索到它时对其进行反序列化。
这非常适合存储,但在查询方面实现起来可能会变得很棘手(因为您的查询现在使用数据库使用的原始 Data
)。
实现这一点的更简单方法是使用隐藏原始值的计算属性(通常是String
或Int
)。
这里是你如何实现它:
enum Mood: String
case happy
case sad
class MyObject: NSManagedObject
@NSManaged private var rawMood: String?
var mood: Mood?
get
if let rawMood = self.rawMood
return Mood(rawValue: rawMood)
else
return nil
set
self.rawMood = newValue?.rawValue
请记住,当您在查询中添加约束时,您需要使用 rawMood
并将其传递给 String
。 Core Data 不知道 mood
属性。
【讨论】:
【参考方案2】:没有必要让 Core Data 托管对象接受枚举,尤其是在这种简单的情况下。
只需使用标准的String
属性,将其称为mood
,并在您对其进行读写时进行枚举评估和适当的逻辑。这将产生人类可读、直观的代码。
编辑:示例实现
enum Mood: String case happy, ok, sad
class Person: NSManagedObject
var mood: String?
// set
person.mood = Mood.happy.rawValue
// get
let aPersonsMood = Mood(rawValue: person.mood!)
【讨论】:
谢谢,你能给我一个这个实现的例子吗?以上是关于核心数据和自定义属性类型的主要内容,如果未能解决你的问题,请参考以下文章