Как обновить кусочек блоба в SQLite? - PullRequest
6 голосов
/ 24 марта 2009

У меня есть большие двоичные объекты в приложении SQLite, и мне нужно кусочно обновлять небольшие сегменты этих больших объектов. Что-то вроде произнесения «обновить байты с X по Y блоба B данными D», это можно сделать в других базах данных с функциями, управляющими блобами, но я не могу найти ничего подобного для SQLite, застрял? Или у SQLite есть способы манипулирования BLOB-объектами?

Спасибо.

Ответы [ 3 ]

7 голосов
/ 24 марта 2009

Это не является прямым ответом на ваш вопрос, но у меня есть некоторый опыт использования произвольного доступа для (больших) больших двоичных объектов в SQLite, и я советую вам не использовать его, если можете. И вот почему:

Капли полностью нарушают формат запроса SQL. Если данные вашего блоба нуждаются в какой-либо обработке, они, безусловно, в какой-то момент будут нуждаться в фильтрации. Какой бы механизм вы ни использовали для фильтрации в SQL, это будет бесполезно в этом отношении.

Работа с двоичными двоичными объектами, размещенными в базах данных, в отличие от двоичных данных в необработанных файлах, ограничивает ваши возможности. Вы не сможете произвольно читать и записывать данные одновременно из нескольких процессов, что возможно для файлов. Вы не можете использовать какой-либо инструмент, который работает с этими данными и предоставляет только интерфейс ввода-вывода файлов. Вы не можете обрезать или изменить размер BLOB-объекта. Файлы просто намного более универсальны.

Может показаться удобным иметь все содержимое одного файла, поскольку это упрощает резервное копирование и передачу, но боль от работы с BLOB-объектами просто не стоит.

Поэтому, как ваш адвокат, я советую вам записывать ваши двоичные объекты как необработанные файлы в файловую систему и просто сохранять ссылку на имя файла в вашей базе данных. Если ваши пятна довольно маленькие и гарантированно не растут, забудьте мой совет.

4 голосов
/ 24 марта 2009

SQLite 3.x поддерживает это с помощью функции sqlite3_blob_write .

int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset)

Обратите внимание, что эта функция предоставляется как часть API SQLite 3 C / C ++. Вам нужно будет запрограммировать против этого напрямую, чтобы использовать его.

Если вы используете какую-то другую обертку более высокого уровня, например System.Data.SQLite, в прошлый раз, когда я смотрел, у вас не будет доступа к этой функции.

3 голосов
/ 29 июля 2009

Я полностью согласен со всем, что сказал paniq. Использование BLOB значительно ограничивает ваши возможности.

Если вы используете System.Data.SQLite, у вас не будет реальной поддержки BLOB. Вот почему я написал свой собственный класс, чтобы справиться с ними. Вы можете найти код здесь: Пример кода BLOB

Обратите внимание, что SQLite имеет несколько потенциальных ловушек для тех, кто решается работать с BLOB. Одна из основных проблем заключается в том, что SQLite загружает все поле BLOB в память, прежде чем позволяет вам даже проверять их длину.

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