【问题标题】: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 我明白你的意思,但我不知道怎么解释,你能解释得更好吗?

标签: ios swift core-data swift3


【解决方案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!)
    

    【讨论】:

    • 谢谢,你能给我一个这个实现的例子吗?
    猜你喜欢
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多