核心数据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
答案 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。