Почему моя модель базовых данных больше не работает?Integer16 значение листает? - PullRequest
0 голосов
/ 21 сентября 2011

Итак, в марте прошлого года я отправил приложение для iPad в магазин приложений.Он содержит модель базовых данных с предварительно заполненным хранилищем данных двоичного дерева.Я написал крошечное 64-разрядное приложение OSX для преобразования и извлечения данных из произвольной 200-мегабайтной базы данных SQLite в свою собственную модель базовых данных, что привело к созданию аккуратного постоянного хранилища SQLite размером 20 МБ.Все денди, переведено в систему управления версиями и никогда не оглядывалось назад.

Теперь у моего клиента есть обновленная база данных, и он также хочет отправить обновленное приложение.Я подумал, что это не займет больше, чем снова запустить конвертер и переиздать в iTunesConnect, но нет.Мой конвертер не запустится или не выведет нужный магазин.Я потратил часы и часы, пытаясь выяснить, в чем дело, прежде чем, наконец, все вернуть назад, когда я первоначально отправил свое приложение в магазин, и угадать, что конвертер даже не конвертирует.Тот же код, та же входная база данных, все то же самое!

Просматривая некоторые данные, к которым привело мое приложение, я обнаружил странное несоответствие в том, как некоторые значения хранятся в модели Core Data.В этих трех строках групповой объект является сущностью Core Data.Свойство идентификатора имеет тип Integer 16, как и все мои целочисленные значения в модели.Достаточно забавно, когда я смотрю на значения после этих трех строк:

int identifier = 39899;
NSNumber *numIdentifier = [NSNumber numberWithInt:identifier];
group.identifier = numIdentifier;

Я получаю эти три значения:

identifier:       39899
numIdentifier:    39899
group.identifier: -25637

Ошибка, что?Число, разумеется, будет получено из исходной базы данных, но даже при вставке его вручную последнее свойство основного объекта данных искажается.Почему эта последняя строка отличается?Отрицательный что?Конечно, значение даже близко не приближается к INT_MAX, почему это выглядит так, как будто оно оборачивает подписанное int?И почему теперь все по-другому, когда в марте с тем же кодом и той же входной базой данных он работал нормально?Единственное, что я могу вспомнить, изменившись с тех пор, это обновление до OSX Lion.Но, конечно, это не могло повлиять на это, верно?

Кто-нибудь знает, что я делаю неправильно, что я, возможно, делал неправильно в прошлом марте, и как я могу исправить этот беспорядок?

Ответы [ 2 ]

5 голосов
/ 21 сентября 2011

Нормальный int - это 32 бита, а не 16. Хотя 32 бита достаточно велико для этого значения, 16 - нет! -25637 - переполненное значение. Вам нужны либо меньшие числа, либо большие переменные.

2 голосов
/ 02 ноября 2011

См. Также «CoreData и целочисленная ширина в iOS 5» http://www.seattle -ipa.org / 2011/09/11 / coredata-and-integer-width-in-ios-5 /

"В iOS 3 или 4 вы можете избежать сохранения целого числа, большего, чем указано в вашей модели, но в iOS5 теперь применяется целая ширина."

Вопрос по переполнению стека ЯдроСвойство изменения данных с целого числа 16 на целое число 32

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...