Apple не рекомендует хранить BLOB в базах данных SQLite, размер которых превышает ~ 2 килобайта.
SQLite организует базы данных в страницы. Каждая страница имеет размер 4 килобайта. Когда вы читаете данные из файла базы данных SQLite, он загружает эти страницы во внутренний кеш страниц. На iPhone я думаю, что этот кэш по умолчанию имеет размер 1 мегабайт. Это делает чтение соседних записей очень быстрым, потому что они, вероятно, уже будут в кеше страницы.
Когда SQLite считывает вашу запись базы данных в память, она читает всю запись и все страницы, которые она занимает. Поэтому, если ваша запись содержит BLOB, она может занимать много страниц, и вы будете извлекать существующие страницы из кэша и заменять их страницами своей записи BLOB.
Это не так уж плохо, если вы просто просматриваете и загружаете все свои BLOB-объекты, чтобы что-то с ними сделать (например, отобразите их). Но если, скажем, вы сделали запрос, в котором вы просто хотели получить некоторые данные, которые находятся в той же строке, что и BLOB, этот запрос был бы намного медленнее, чем если бы запись не содержала большой BLOB.
Так что, как минимум, вы должны хранить данные BLOB в отдельной таблице. Например:
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) );
Или, что еще лучше, храните данные BLOB в виде файлов вне базы данных SQLite.
Обратите внимание, что можно изменить размер кэша страницы с помощью операторов SQL PRAGMA (если вы не используете CoreData).