【问题标题】:core data: save different types as the same attribute核心数据:将不同类型保存为同一个属性
【发布时间】:2016-01-07 18:46:42
【问题描述】:

我有一个核心数据实体,它有一个属性可以表示不同类型的值(int、double、date、string)。

如果我将所有这些值转换为字符串然后再返回,是否会导致问题(例如精度损失)?

@nsmanaged var storedType : Int
@nsmanaged var storedValue : String
var value: Any? {
{
 set {
  switch newValue
  {
  case is Int:
    self.storedValue = String(newValue)
    self.storedType = 0

  ...

  case is string
    self.storedValue = newValue
    self.storedType = 5
  }
 }
 get {
  switch newValue
  {
  case is 0:
    return Int(self.storedValue)

  ...

  case is 5:
    return self.storedValue
  }
 }
}
}

【问题讨论】:

  • “我有一个核心数据实体,它有一个属性可以表示不同类型的值(int、double、date、string)。”对不起,我是将不得不去一个黑暗的房间里躺一会儿。同时,你为什么要做这样的事情?
  • 实体描述了数据文件中的范围。数据文件可以是字符串、日期、整数、浮点数或用户指定的任何自定义格式。所以要么我有一个带有一大堆子实体的抽象实体,要么我将范围值转换为字符串。用户可以在创建实体后更改格式。如果我使用子实体,我必须复制其他字段,删除实体,创建一个新实体,设置所有字段并确保 UI 仍然可以更改两个值:开始和结束。使用关系也需要几个几乎不使用的子实体。

标签: core-data swift2


【解决方案1】:

虽然我会首先对架构进行长期而认真的思考,但我同意可能存在此功能的情况,以及除此之外的其他地方应该问这个问题*。

一种选择是使用可转换的属性类型。这种类型允许 coreData 存储任何符合 NSCoding 的对象(NSArray、NSDictionary 等)以及我相信的 NSString 和 NSNumber。

因此,您可以将该对象检索为泛型类型(Objective-C 中的 id,不知道 swift 中的等价物),然后查询它的类型并将其转换为您需要的任何内容。

这种方法的缺点当然是您在查询存储时失去了很多 coreData 功能,因为您存储为可转换属性的值对谓词等变得或多或少不透明。但是,它可以很好地使用关键路径遍历核心数据结构。

*) 我相信我读到 VB 中的等效变体数据类型是 Joel Spolsky 对该语言的贡献之一...

【讨论】:

  • 感谢您考虑我的问题和您的回答。我们中的一些人是自学成才的程序员,他们在进行过程中制作/学习东西,他们唯一的帮助/指导位置是 SO 之类的网站。
  • 这里的情况相同 - 所以完全同意。今天我被自己的一些架构问题困住了,并且通过写 SO...
  • 做其他事情有助于解决问题。就像他们说的:睡在上面。 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多