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