Apple ajánlás nem tárolja BLOB azon az SQLite adatbázisok, amelyek nagyobbak, mint ~ 2 kilobyte.
SQLite szervezi adatbázisokat oldalakon. Minden oldalon 4 kilobájt méretű. Ha olvasni az adatokat a SQLite adatbázis fájlt betölti ezeket az oldalakat egy belső oldal cache. Az iPhone Azt hiszem, ez gyorsítótár alapértelmezés szerint 1 megabájt méretű. Ez teszi olvasás szomszédos bejegyzések nagyon gyorsan, mert valószínűleg az oldal cache már.
Amikor SQLite beolvassa az adatbázis rekord a memóriába beolvassa a teljes rekord és az összes oldalt, hogy elfoglalja. Tehát, ha a rekord tartalmaz egy BLOB, lehetett elfoglalni sok oldalt, és akkor kiveszi a meglévő oldalakat a cache, és helyettük a BLOB rekord oldalakon.
Ez nem is olyan rossz, ha csak olvas keresztül, és betölti az összes festékfoltok, hogy tegyen valamit velük (megjeleníti azokat például). De ha mondjuk te egy lekérdezést, ahol csak akart néhány adat, amely ugyanabban a sorban, mint a BLOB ez a lekérdezés lenne sokkal lassabb, mint ha a rekord nem tartalmazza a nagy BLOB.
Így legalább meg kell tárolni a BLOB adatok külön táblázatban. Például:
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) );
Vagy még jobb, tárolja a BLOB adatok fájlként kívül SQLite adatbázisban.
Megjegyezzük, hogy akkor lehet, hogy a csípés oldal cache méretű SQL PRAGMA nyilatkozatok (ha éppen nem használja CoreData).