核心数据和自定义属性类型

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 中使用枚举的常用方法是使用计算属性将案例映射到 IntString @iosAppDev 这是特定目的:我有一个“情绪”属性,可能有 3 种不同的情绪,这就是我选择枚举的原因。那么我应该使用 Transofrmable 吗? @vadian 我明白你的意思,但我不知道怎么解释,你能解释得更好吗? 【参考方案1】:

CoreData 中有一个名为 Transformable 的类型,专门用于处理本机不支持的类型。

基本上,这种类型会帮助您在将不支持的类型存储到数据库之前将其自动序列化为Data 对象,并在检索到它时对其进行反序列化。 这非常适合存储,但在查询方面实现起来可能会变得很棘手(因为您的查询现在使用数据库使用的原始 Data)。


实现这一点的更简单方法是使用隐藏原始值的计算属性(通常是StringInt)。

这里是你如何实现它:

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!)

【讨论】:

谢谢,你能给我一个这个实现的例子吗?

以上是关于核心数据和自定义属性类型的主要内容,如果未能解决你的问题,请参考以下文章

Swift中自定义对象和自定义对象数组的通用属性[重复]

使用 jQuery Hovercard 和自定义数据属性创建 Hovercard

用户自定义属性id和自定义属性值不能一一匹配

UIView 默认属性和自定义属性

核心数据中具有自定义类型的所有属性都必须是关系吗?

Android 自定义ViewViewGroup和自定义属性