Recomandarea Apple nu este de a stoca lui BLOB în baze de date SQLite, care sunt mai mari decât ~ 2 kilobytes.
SQLite organizează baze de date în pagini. Fiecare pagină este de 4 kilobytes în dimensiune. Când citiți datele din fișierul SQLite baza de date se încarcă aceste pagini într-o memorie cache pagină internă. Pe iPhone cred că această memorie cache implicit la 1 MO. Acest lucru face ca citirea înregistrărilor adiacente foarte repede, deoarece acestea vor fi, probabil, în cache-ul paginii deja.
Când SQLite citește înregistrarea bazei de date în memorie citește întreaga înregistrare și toate paginile pe care le ocupă. Deci, în cazul în care dosarul dumneavoastră conține o pată de cerneală, s-ar putea ocupa mai multe pagini și veți fi ejectarea paginile existente din cache-ul și înlocuirea lor cu paginile de înregistrare dvs. BLOB lui.
Acest lucru nu este atât de rău, dacă sunteți doar scanarea și încărcarea tuturor blobs de a face ceva cu ei (a le afișa, de exemplu). Dar dacă spune că a făcut o interogare în cazul în care ai vrut doar pentru a obține unele date care este în același rând BLOB această interogare ar fi mult mai lent decât în cazul în care înregistrarea nu conține BLOB mare.
Deci, la un nivel minim ar trebui să stocați datele BLOB într-un tabel separat. De exemplu:
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) );
Sau mai bine, stoca datele BLOB ca fișiere în afara bazei de date SQLite.
Rețineți că poate fi posibil pentru a optimiza dimensiunea paginii cache cu instrucțiuni SQL Pragma (dacă nu utilizați CoreData).