Я пытаюсь хранить NSMutableDictionaries в виде блоков в sqlite, сначала преобразовывая его в NSData через NSPropertyListSerialization или NSKeyedArchiver.NSData усекается при хранении в базе данных sqlite
Когда я храню blob, длина объекта NSData составляет тысячи (диапазон KB). Когда я верну его, он будет усечен до 10 байтов. Когда я проверяю DB через SQLite Browser, большая часть данных ушла (я могу распознавать ключи в записи, если я храню словарь как NSPropertyListSerialization, но значения словаря исчезли). Это происходит независимо от того, использую ли я NSPropertyListSerialization или NSKeyedArchiver для сериализации моих данных.
NSMutableDictionary* item = [items objectAtIndex:i];
NSData *dictionary = [NSKeyedArchiver archivedDataWithRootObject:item];
sqlite3_bind_blob( compiledStatement, 5, [dictionary bytes], [dictionary length], SQLITE_TRANSIENT);
Это на самом деле фрагмент из моего кода, полный раздел которого я разместил в другом связанном с ним вопросе.
Bulk inserts into sqlite db on the iphone
Проверка значения [словаря длина] с помощью GDB или NSLog дает тот же результат: Длина данных находится в диапазоне KB.
Когда я проверяю получить данные позже:
NSData* raw = [[NSData alloc] initWithBytes:sqlite3_column_blob(compiledStatement, 1) length:sqlite3_column_bytes(compiledStatement, 1)];
[raw release];
Проверку [сырая длина] дает мне всего 10 байт. Это верно для каждого экземпляра данных, которые я попытался сохранить в этом столбце, независимо от их начального размера, в конце концов они заканчиваются 10 байтами. В моем поисковом запросе нет ничего плохого. Я запустил его в командной строке и в браузере SQL, и я получаю правильные записи и столбцы, но данные, которые были сохранены в записи для этого конкретного столбца, неверны.
Что случилось с остальными моими данными? Что-то не так с тем, как я использую sqlite3_bind_blob? Я проверил документацию sqlite для прекращения символов или максимальных размеров. Мои данные находятся в пределах максимального размера записи blob, и я не могу найти никакой информации о терминалах, которые могли бы сократить мои данные до размера.
Я проверил бы максимальный размер по умолчанию для blobs и способы его настройки. Это или вы буферизируете данные где-то, и только первый кусок делает это. –
Отсутствует максимальный размер по умолчанию, AFAICT из документов ... только максимальный размер. Что огромно. Гораздо больше, чем то, что я пытаюсь сохранить. Я проверяю значения прямо перед вызовом связывания, и экземпляр NSData является активным и действительным до этого времени. Во время вызова привязки передача SQLITE_TRANSIENT в качестве параметра должна копировать данные, которые я им передаю ... так что потеря данных позже не должна быть проблемой. – akaii
Что находится в 10 байтах? Действительно ли это усечение данных словаря? – Chuck