为什么Core Data中没有Integer 8 NSAttributeDescription属性?

时间:2014-11-28 17:58:30

标签: ios core-data nsattributedescription

核心数据NSAttributeDescription具有16位,32位和64位数字的整数类型,但不适用于8位数字。这是为什么?是否建议在整数16类型中存储8位数字?

从存储角度来看,将数据大小加倍(通过使用16位来存储8位数字)似乎很浪费。此外,如果由于程序员错误,在整数16中存储了一个超出8位数范围的数字,会发生什么?然后任何带int8_t的函数/方法都可以传递错误的数字。例如:

NSManagedObject *object = // fetch from store
int16_t value = object.value.intValue;

[otherObject methodThatTakesInt8:(int8_t)value]; // bad things happen if value isn't within an 8-bit range

2 个答案:

答案 0 :(得分:2)

我不认为为什么NSAttributeDescription没有提供8位数字的答案比核心数据没有8位存储更复杂类型。这可能是一个循环论证。可能苹果公司没有看到它的价值。

至于你的其他问题:如果程序员想要存储一个12位数字怎么办?如果他们想存储24位数字怎么办?在现代世界中,拔出8位作为一种特殊情况似乎很奇怪。但问题很容易解决:您可以在任何-willSave子类上实现NSManagedObject,以在数据提交到商店之前验证数据。或者您可以实现自己的自定义setter(最终调用-setPrimitiveValue:forKey:),类似于在设置时立即验证。在任何一种情况下,你都可以为越界数量实现你想要的任何策略:引发异常,饱和,无论如何。

答案 1 :(得分:1)

除了@ Tommy的答案之外,如果您使用的是SQLite持久性存储(几乎每个人在使用Core Data时都会这样做),从存储的角度来看实际上并不浪费。 SQLite使用dynamic typing,这意味着任何列都可以包含任何类型的值。尺寸要求根据保存的值确定。如果您告诉Core Data您想要一个64位整数属性但该属性的所有值都适合8位,那么您实际上并没有浪费该属性所用空间的7/8。