Empfehlung von Apple ist nicht Blob zu speichern in SQLite-Datenbanken, die größer als ~ 2 Kilobyte sind.
SQLite organisiert Datenbanken in Seiten. Jede Seite ist 4 Kilobyte groß. Wenn Sie Daten aus der SQLite-Datenbank-Datei lesen lädt es diese Seiten in eine interne Seiten-Cache. Auf dem iPhone ich denke, das Cache standardmäßig auf 1 Megabyte groß. Das macht sehr schnell benachbarte Aufzeichnungen zu lesen, weil sie wahrscheinlich schon in den Seiten-Cache sein.
Wenn SQLite liest Ihre Datenbank-Datensatz in den Speicher liest sie den gesamten Datensatz und alle Seiten, die es einnimmt. Also, wenn Ihr Datensatz ein BLOB enthält, könnte es viele Seiten einnehmen, und Sie werden bestehende Seiten aus dem Cache werden Auswerfen und sie mit Ihrem BLOB Rekord Seiten zu ersetzen.
Das ist nicht so schlimm, wenn Sie gerade das Scannen durch und laden alle Ihre BLOBS mit ihnen etwas zu tun (sie zum Beispiel angezeigt werden). Aber wenn sagen haben Sie eine Abfrage, wo Sie wollte nur einige Daten erhalten, die in der gleichen Zeile wie die BLOB ist diese Abfrage viel langsamer als sein würde, wenn der Datensatz nicht die große BLOB enthielt.
Also auf ein Minimum sollten Sie Ihre BLOB-Daten in einer separaten Tabelle gespeichert werden. Z.B:
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) );
Oder noch besser, speichern Sie die BLOB-Daten als Dateien außerhalb der SQLite-Datenbank.
Beachten Sie, dass es möglich sein kann , die Seiten - Cache - Größe mit zwicken SQL PRAGMA - Anweisungen (wenn Sie nicht Coredata verwenden).