raccomandazione di Apple non è quello di memorizzare BLOB di in database SQLite che sono più grandi di ~ 2 kilobyte.
SQLite database organizza in pagine. Ogni pagina è di 4 kilobyte di dimensione. Quando si leggono i dati dal file di database SQLite carica queste pagine in una cache pagina interna. Su iPhone penso che questa cache di default è 1 megabyte di dimensione. Questo rende la lettura record adiacenti molto veloce perché probabilmente saranno nella cache di pagina già.
Quando SQLite legge il tuo record di database in memoria si legge l'intero record e tutte le pagine che occupa. Così, se il record contiene un BLOB, si potrebbe occupare molte pagine e sarai espulsione pagine esistenti dalla cache e la loro sostituzione con le pagine del vostro record di BLOB.
Questo non è così male se siete solo la scansione attraverso e il caricamento di tutto il tuo blob di fare qualcosa con loro (li visualizza per esempio). Ma se dire che hai fatto una query in cui si voleva solo per ottenere alcuni dati che è nella stessa fila del BLOB questa query sarebbe molto più lento se il record non conteneva la grande BLOB.
Quindi, come minimo si dovrebbe memorizzare i dati BLOB in una tabella separata. Per esempio:
CREATE TABLE blobs ( id INTEGER PRIMARY KEY, data BLOB );
CREATE TABLE photos ( id INTEGER PRIMARY KEY, name TEXT, blob_id INTEGER,
FOREIGN KEY(blob_id) REFERENCES blobs(id) );
O meglio ancora, memorizzare i dati BLOB come file al di fuori del database SQLite.
Si noti che può essere possibile modificare la dimensione della cache pagina con le istruzioni SQL PRAGMA (se non si utilizza CoreData).