Если это вообще возможно, при записи данных на диск или по сети лучше четко указывать размер значения.Вместо использования NSUInteger в качестве типа данных используйте uint16_t
, uint32_t
или uint64_t
в зависимости от необходимого диапазона.Затем это естественным образом переводится в целочисленные значения 16, 32 и 64 в базовых данных.
Чтобы понять, почему, рассмотрим следующий сценарий:
- Вы решили использовать тип Integer 64 для хранения своего значения.
- На 64-разрядном устройстве iOS (например,iPhone 6) он хранит значение 5 000 000 000.
- На 32-разрядном устройстве iOS это значение выбирается из хранилища в
NSUInteger
(с использованием NSNumber's unsignedIntegerValue
).
Теперь, поскольку NSUInteger
является 32-разрядным на 32-разрядном устройстве, число больше не составляет 5 000 000 000, потому что недостаточно битов для представления 5 миллиардов.Если вы поменяли NUInteger
в шаге 3 на uint64_t
, тогда значение все равно будет равно 5 млрд.
Если вам абсолютно необходимо использовать NSUInteger, то вам просто нужно с осторожностью относиться к описанным проблемамвыше и используйте для этого защитный код.
Что касается хранения неподписанных значений в, казалось бы, подписанных типах базовых данных, вы можете безопасно хранить их и извлекать:
NSManagedObject *object = // create object
object.valueNumber = @(4000000000); // Store 4 billion in an Integer 32 Core Data type
[managedObjectContext save:NULL] // Save value to store
// Later on
NSManagedObject *object = // fetch object from store
uint32_t value = object.valueNumber.unsignedIntegerValue; // value will be 4 billion