la recomendación de Apple es no almacenar BLOB de bases de datos SQLite en que son más grandes de lo ~ 2 kilobytes.
SQLite organiza las bases de datos en páginas. Cada página es de 4 kilobytes de tamaño. Cuando uno lee los datos desde el archivo de base de datos SQLite se carga estas páginas en una memoria caché de páginas internas. En el iPhone Creo que esta caché por defecto a 1 megabyte de tamaño. Esto hace que la lectura de los registros adyacentes muy rápido, ya que probablemente estarán en la caché de páginas ya.
Cuando SQLite lee su registro de base de datos en la memoria se lee el registro completo y todas las páginas que ocupa. Así que si su registro contiene un BLOB, podría ocupar muchas páginas y se le expulsa las páginas existentes de la memoria caché y su sustitución por las páginas de su récord BLOB.
Esto no es tan malo si sólo está escaneando a través y cargar todos sus gotas para hacer algo con ellos (los muestra por ejemplo). Pero si decir que hizo una consulta en la que sólo quería conseguir algunos datos que se encuentra en la misma fila que el BLOB esta consulta sería mucho más lento que si el expediente no contiene la gran BLOB.
Así que, como mínimo, debe almacenar sus datos BLOB en una tabla separada. P.ej:
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 mejor aún, almacenar los datos BLOB como archivos fuera de la base de datos SQLite.
Tenga en cuenta que puede ser posible ajustar el tamaño de caché de páginas con declaraciones SQL PRAGMA (si no se está usando CoreData).