1

Core DataNSAttributeDescription具有 16 位、32 位和 64 位数字的整数类型,但不具有 8 位数字的整数类型。这是为什么?是否推荐将 8 位数字存储为 Integer 16 类型?

从存储的角度来看,将数据大小翻倍(通过使用 16 位存储 8 位数字)似乎很浪费。另外,如果由于程序员的错误,一个 8 位数字范围之外的数字存储在该整数 16 中会发生什么?那么任何采用的函数/方法都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
4

2 回答 2

2

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

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

于 2014-11-28T18:08:14.550 回答
1

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

于 2014-11-28T23:55:20.717 回答