2009-03-24 11 views
6

Tengo grandes blobs en una aplicación de SQLite, y necesito actualizar pequeños segmentos de estos blobs de forma discontinua. Algo así como decir "actualizar los bytes X a Y de blob B con datos D", esto se puede hacer en otras bases de datos con funciones de manipulación de Blob, pero no puedo encontrar nada como esto para SQLite, ¿estoy atascado? ¿O SQLite tiene formas de manipular Blobs?¿Cómo actualizar por partes un blob en SQLite?

Gracias.

Respuesta

4

SQLite 3.x lo admite mediante la función sqlite3_blob_write.

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

Tenga en cuenta que esta función se proporciona como parte de la API SQLite 3 C/C++. Tendrá que programar contra esto directamente para usarlo.

Si está utilizando algún otro envoltorio de nivel superior como System.Data.SQLite, la última vez que lo busqué, no tendrá acceso a esta función.

7

Esta no es una respuesta directa a su pregunta, pero tengo cierta experiencia en el uso de acceso aleatorio para blobs (grandes) en SQLite, y le aconsejo que no la use, si puede. He aquí por qué:

Las manchas rompen por completo el formato de consulta SQL. Si los datos de su blob necesitan algún tipo de procesamiento, en algún momento será necesario filtrarlos. Cualquier mecanismo que tenga en su lugar para lidiar con el filtrado en SQL será inútil en este sentido.

El tratamiento de blobs binarios envueltos en bases de datos opuestas a datos binarios en archivos sin formato limita sus opciones. No podrá leer y escribir aleatoriamente datos al mismo tiempo desde múltiples procesos, lo cual es posible con los archivos. No puede usar ninguna herramienta que maneje estos datos y proporciona solo una interfaz de E/S de archivos. No puede truncar o cambiar el tamaño del blob. Los archivos son simplemente mucho más versátiles.

Puede parecer conveniente tener todo contenido en un archivo, ya que simplifica la copia de seguridad y la transferencia, pero el dolor de trabajar con blobs simplemente no lo vale.

Así que como su abogado, le aconsejo que escriba sus blobs como archivos sin procesar en el sistema de archivos, y simplemente almacene una referencia al nombre del archivo en su base de datos. Si tus blobs son bastante pequeños y tienes la garantía de que no crecerán, olvida mi consejo.

+1

Bueno, la mancha puede crecer ocasionalmente , pero eso es durante una actualización completa de los servicios, por lo que es "seguro" decir que son de longitud constante dentro de un "ciclo de producto" (sin importar qué tan largo o corto sea) –

+0

Pero estoy totalmente de acuerdo con cada palabra que dices , Preferiría realmente evitar los blobs, pero debido a la forma en que se diseñan las especificaciones, no tengo otra opción:/ –

+0

Thumbs up. Él va a necesitar muchos consejos legales antes de que esto termine. : P – Cray

3

Estoy totalmente de acuerdo con todo lo dicho por paniq. El uso de BLOB limita considerablemente sus opciones.

Si está utilizando System.Data.SQLite, no tendrá soporte real para BLOB. Es por eso que escribí mi propia clase para manejarlos. Puede encontrar el código aquí: Sample BLOB code

Tenga en cuenta que SQLite tiene varios peligros potenciales para los que se atreven a trabajar con BLOB. Uno de los principales problemas es que SQLite carga todo el campo BLOB en la memoria antes de permitirle siquiera verificar su longitud. Por lo tanto, espere una gran cantidad de memoria si tiene grandes campos BLOB ...

+0

Falta su archivo –

Cuestiones relacionadas