2010-03-16 4 views
3

Я пытаюсь хранить 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, и я не могу найти никакой информации о терминалах, которые могли бы сократить мои данные до размера.

+1

Я проверил бы максимальный размер по умолчанию для blobs и способы его настройки. Это или вы буферизируете данные где-то, и только первый кусок делает это. –

+0

Отсутствует максимальный размер по умолчанию, AFAICT из документов ... только максимальный размер. Что огромно. Гораздо больше, чем то, что я пытаюсь сохранить. Я проверяю значения прямо перед вызовом связывания, и экземпляр NSData является активным и действительным до этого времени. Во время вызова привязки передача SQLITE_TRANSIENT в качестве параметра должна копировать данные, которые я им передаю ... так что потеря данных позже не должна быть проблемой. – akaii

+0

Что находится в 10 байтах? Действительно ли это усечение данных словаря? – Chuck

ответ

0

Я нашел преступника в этой дикой доброй погоне ... Я принимал значение столбца 1 вместо столбца 0, который был фактическим столбцом, в котором содержались мои данные. Я предположил, что, поскольку значения привязки к вашему запросу начинаются с столбца 1, извлечение столбцов из результатов запроса также начинается с 1. Моя ошибка.

10 байтов на строку на самом деле не были моими данными словаря, но меткой времени, которую я использовал для сортировки результатов.

2

Вы проверили тип возврата этого связывания? Возможно, что он возвращает код ошибки (оператор все равно будет выполняться, возможно, в этом случае, просто неправильно).

В качестве обходного пути вы пытались создать ZEROBLOB, а затем записывали его с помощью процедур ввода-вывода BLOB, описанных в SQLite documentation? Это будет следующая вещь, которую я попробую, посмотрев коды ошибок.

+0

Он возвращает SQLITE_OK. Я дам blob i/o выстрел, но это настолько невероятно крутая манера подавать blob в базу данных, когда вы не сохраняете поэтапно. – akaii

+0

Кроме того, после тщательного изучения этого метода, я беспокоюсь о накладных расходах. Сначала мне нужно будет вставить запись, а затем сразу же обновить ее, получив ручку blob после этого? Думаю, нет смысла писать в zeroblob, пока он даже не существует, но для моей транзакции это займет больше времени, и я серьезно обеспокоен производительностью. – akaii

+0

Zeroblob является просто заполнителем - он не занимает какое-либо пространство (или производительность), пока вы не напишете фактические данные о блобе. Поэтому не беспокойтесь о производительности, если это не проблема. –

Смежные вопросы