Форма Feching Image sqlite (с использованием класса FMDatabase) - PullRequest
0 голосов
/ 24 февраля 2012

Проблема: - Я использую класс FMDatabase для хранения данных в базе данных и доступа к данным из БД.В одной таблице я использовал тип данных Blob для хранения Image.способ:

     UIImage *img = [UIImage imageNamed:@"image.png"];
     NSData *data = UIImagePNGRepresentation(img);
    [fmdbase executeUpdate:[NSString stringWithFormat: @"Insert into tblComm('%d,%@','%@')",cID,cmmentsString,data...]];

и доступ к данным, подобным этому,

     commentsText.text = [records stringForColumn:@"comments"];
   //  NSData *data = [records stringForColumn:@"photo"];
      NSData *data = [records dataForColumn:@"photo"];
     UIImage *img = [UIImage imageWithData:data];

, но данные не в точном формате и не показывают изображение. Помогите?

1 Ответ

1 голос
/ 24 февраля 2012

Одним из вариантов (и обычно предпочтительным при работе в SQL) является запись изображения в файл в системе и сохранение пути (или некоторого другого вида идентификатора) в базе данных.

Некоторые внутренние компонентыкак sqlite хранит записи и почему он не может быть оптимизирован для хранения изображений.Apple не рекомендует хранить BLOB в базах данных SQLite, размер которых превышает ~ 2 килобайта.

SQLite организует базы данных в страницы.Каждая страница имеет размер 4 килобайта.Когда вы читаете данные из файла базы данных SQLite, он загружает эти страницы во внутренний кеш страниц.На iPhone я думаю, что этот кэш по умолчанию имеет размер 1 мегабайт.Это делает чтение соседних записей очень быстрым, потому что они, вероятно, уже будут в кеше страниц.

Когда SQLite считывает вашу запись базы данных в память, она читает всю запись и все страницы, которые она занимает.Таким образом, если ваша запись содержит BLOB, она может занимать много страниц, и вы будете извлекать существующие страницы из кэша и заменять их страницами своей записи BLOB.

Это не так уж плохо, если вы просто сканируетеи загрузите все свои BLOB-объекты, чтобы что-то с ними сделать (например, отобразить их).Но если, скажем, вы сделали запрос, в котором вы просто хотели получить некоторые данные, которые находятся в той же строке, что и BLOB, этот запрос был бы намного медленнее, чем если бы запись не содержала большой BLOB.Поэтому, как минимум, вы должны хранить свои BLOB-данные в отдельной таблице.Или, что еще лучше, сохраняйте данные BLOB в виде файлов вне базы данных SQLite, как я и предлагал вначале.

Обратите внимание, что может быть возможно настроить размер кэша страницы с помощью операторов SQL PRAGMA (если вы не используете CoreData).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...