Apple doporučení není ukládat BLOB je v SQLite databáze, které jsou větší než ~ 2 kilobajtů.
SQLite databáze organizuje do stran. Každá stránka je 4 kB velikost. Když budete číst data ze souboru databáze SQLite načte tyto stránky do interní paměti cache stránky. Na iPhone Myslím, že tato vyrovnávací paměti výchozí hodnota je 1 megabajt ve velikosti. To dělá čtení sousedních záznamů velmi rychle, protože budou pravděpodobně v cache stránek již.
Když SQLite čte databázový záznam do paměti přečte celý záznam a všechny stránky, které zabírá. Takže pokud váš záznam obsahuje BLOB, může to zabírat mnoho stránek a budete vysunutím stávající stránky z cache a jejich nahrazení stránkách svého blob rekord je.
To není tak špatné, pokud jste právě skenování až do konce a nahrává všechny vaše bloby udělat něco s nimi (jejich zobrazení například). Ale v případě, že jste udělal dotaz, kde si jen chtěli získat nějaké informace, která je ve stejném řádku jako BLOB Tento dotaz by byl mnohem pomalejší než v případě, že záznam neobsahoval velký BLOB.
Takže minimálně je třeba ukládat data BLOB v samostatné tabulce. Např:
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) );
Nebo ještě lépe, uložit data BLOB jako soubory mimo databázi SQLite.
Všimněte si, že je možné vyladit velikost stránky vyrovnávací paměti s SQL Pragma závěrky (pokud nepoužíváte CoreData).