aanbeveling van Apple is BLOB's niet op te slaan in SQLite databases die groter zijn dan ~ 2 kilobytes zijn.
SQLite organiseert databases in pagina's. Elke pagina is 4 kilobytes groot. Wanneer u gegevens uit de SQLite database bestand te lezen laadt deze pagina's in een interne pagina cache. Op de iPhone denk dat ik deze cache staat standaard op 1 megabyte groot. Dit maakt het lezen van aangrenzende platen zeer snel omdat ze waarschijnlijk zal worden in de pagina cache al.
Wanneer SQLite leest uw database record in het geheugen leest het volledige verslag en alle pagina's die het inneemt. Dus als uw record een BLOB bevat, kan het aantal pagina's in beslag nemen en u wordt het uitwerpen van bestaande pagina's uit de cache en te vervangen door pagina's van uw BLOB record.
Dit is niet zo slecht als je gewoon scannen door en het laden van al uw VLEKKEN om iets met hen (ze weer te geven bijvoorbeeld) doen. Maar als zeggen dat je deed een vraag waar je wilde alleen maar om een aantal gegevens die zich in dezelfde rij als de BLOB deze vraag zou veel langzamer dan als het record niet de grote BLOB bevatte worden krijgen.
Dus op een minimum moet u uw BLOB-gegevens op te slaan in een aparte tabel. bv:
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) );
Of beter nog, slaan de BLOB data als bestanden buiten de SQLite database.
Merk op dat het mogelijk is om de pagina cache grootte met tweaken SQL PRAGMA statements (als je geen gebruik CoreData).