2009-03-24 11 views
6

Ho grossi blob in un'app SQLite e devo aggiornare piccoli segmenti di questi BLOB in modo approssimativo. Qualcosa come dire "aggiorna i byte da X a Y di blob B con i dati D", questo può essere fatto in altri database con le funzioni di manipolazione di Blob, ma non riesco a trovare nulla di simile per SQLite, sono bloccato? O SQLite ha modi di manipolare i Blob?Come aggiornare a tratti un blob in SQLite?

Grazie.

risposta

4

SQLite 3.x supporta questa funzione tramite la funzione sqlite3_blob_write.

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

Si noti che questa funzione viene fornita come parte dell'API CITE C++ SQLite 3. Avrai bisogno di programmare contro questo direttamente per usarlo.

Se si sta utilizzando un altro wrapper di livello superiore come System.Data.SQLite, l'ultima volta che ho guardato, non si avrà accesso a questa funzione.

7

Questa non è direttamente una risposta alla tua domanda, ma ho un po 'di esperienza nell'usare l'accesso casuale per i blob (grandi) in SQLite, e ti consiglio di non usarla, se puoi. Ecco perché:

Blob interrompono completamente il formato di query SQL. Se i dati blob richiedono un qualsiasi tipo di elaborazione, a un certo punto sarà necessario filtrarli. A prescindere da quale sia il meccanismo che hai in atto per gestire il filtraggio in SQL.

La gestione di blob binari racchiusi in database contrapposti a dati binari in file raw limita le opzioni. Non sarai in grado di leggere e scrivere in modo casuale sui dati contemporaneamente da più processi, cosa possibile con i file. Non è possibile utilizzare nessuno strumento che si occupa di questi dati e fornisce solo un'interfaccia I/O file. Non è possibile troncare o ridimensionare il BLOB. I file sono semplicemente molto più versatili.

Può sembrare conveniente avere tutto contenuto in un unico file, in quanto semplifica il backup e il trasferimento, ma il dolore di lavorare con BLOB non vale la pena.

Così come il tuo avvocato, ti consiglio di scrivere i tuoi BLOB come file raw nel file system, e semplicemente memorizzare un riferimento al nome del file nel tuo database. Se i tuoi BLOB sono piuttosto piccoli e hai la certezza di non crescere, dimentica il mio consiglio.

+1

Beh, il mio blob potrebbe occasionalmente crescere , ma questo è durante un aggiornamento completo dei servizi, quindi è "sicuro" dire che sono di lunghezza costante all'interno di un "ciclo di prodotto" (comunque lungo o corto che possa essere) –

+0

Ma, sono totalmente d'accordo con ogni singola parola che dici , Preferirei davvero evitare il blob, ma a causa del modo in cui sono presentate le specifiche, non ho scelta:/ –

+0

Thumbs up. Avrà bisogno di molti pareri legali prima che questa cosa sia finita. : P – Cray

3

Sono assolutamente d'accordo con tutto ciò che ha detto paniq. L'uso dei BLOB limita considerevolmente le tue opzioni.

Se si utilizza System.Data.SQLite non si avrà un vero supporto per i BLOB. Ecco perché ho scritto la mia classe per gestirli. È possibile trovare il codice qui: Sample BLOB code

Si noti che SQLite presenta diverse potenziali insidie ​​per coloro che hanno il coraggio di lavorare con i BLOB. Uno dei maggiori problemi è che SQLite carica l'intero campo BLOB in memoria prima di consentire anche di controllarne la lunghezza. Quindi aspettatevi un sacco di memoria thrash se avete grandi campi BLOB ...

+0

Il file è mancante –

Problemi correlati