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