Почему в базовых данных нет атрибута Integer 8 NSAttributeDescription attributeType?
Основные данные NSAttributeDescription
имеет целочисленные типы для 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
2 ответа
Я не думаю, что ответ на вопрос, почему NSAttributeDescription
не предлагает 8-битное число, является более сложным, чем то, что Core Data не имеет 8-битный тип хранения. Что, вероятно, является круговым аргументом. Возможно, Apple просто не видела ценности.
Что касается других ваших опасений: что если программист захочет сохранить 12-битное число? Что если они захотят сохранить 24-битное число? Кажется странным вытаскивать 8 бит как особый случай в современном мире. Но проблема легко решается: вы можете реализовать -willSave
на любом NSManagedObject
подкласс для проверки данных, прежде чем они будут переданы в хранилище. Или вы могли бы реализовать свой собственный пользовательский сеттер (в конечном итоге вызов -setPrimitiveValue:forKey:
) аналогично, чтобы проверить сразу после установки. В любом случае вы можете реализовать любую стратегию, которую хотите, для числа, выходящего за пределы: повысить исключение, насыщать, что угодно.
В дополнение к ответу @Tommy, если вы используете постоянное хранилище SQLite (что почти каждый делает при использовании Core Data), оно не является расточительным с точки зрения хранилища. SQLite использует динамическую типизацию, что означает, что любой столбец может содержать значение любого типа. Требования к размеру определяются на основе сохраняемого значения. Если вы сообщаете Core Data, что вам нужен 64-битный целочисленный атрибут, но все значения этого атрибута умещаются в 8 битов, вы фактически не тратите впустую 7/8 пространства, используемого для этого атрибута.