2012-01-23 2 views
0

Я пытаюсь преобразовать jpeg в объект nsdata, а затем сохранить эти данные в столбце blob базы данных sqlite, используя обертку fmdb.NSData UIImageJPEGПреобразование, не записывающее SQLite fmdb

например:

UIImage *img = [UIImage imageNamed:@"house.jpeg" ]; 
NSData *data = UIImageJPEGRepresentation(img, 1.0); 
NSString *query = [NSString stringWithFormat:@"insert into t1 values (null,?)", data ]; 

Где t1 создается что-то вроде:

[database executeUpdate:@"create table t1(rowid integer primary key autoincrement, house blob)" ]; 

В идеале я бы тогда быть в состоянии вытащить данные и преобразовать его обратно в формате JPEG, как так:

NSString *query = @"select * from t1"; 

FMResultSet *results = [database executeQuery:query]; 

while ([ results next ]) 
{ 

    NSData *picData = [ results dataForColumn:@"house" ]; 
    UIImage *housePhoto = [ UIImage imageWithData:picData ]; 
} 

Я использовал этот тип модели для других типов данных, таких как строки и т. Д. Без проблем. В моей текущей попытке я использую эту модель с таблицей столбцов строки и 1 столбцом blob. Когда я пишу в базу данных, все строки хранятся в порядке, но когда я пытаюсь прочитать столбец blob, как указано выше, я возвращаю null для столбца blob. Перед записью в базу данных я дважды проверял, что NSData, с которой я пишу, не был нулевым и содержал представление jpeg, и это произошло. Вызывает ли известная проблема кто-либо или я просто делаю что-то неправильно из-за этого?

+1

Вы проверили полученную SQLite базу данных, чтобы увидеть, если какой-либо данные на самом деле были сохранены в столбец? Это помогло бы определить, является ли проблема написанием данных в первую очередь, а не после ее считывания. Вы также должны проверить, чтобы 'UIImageJPEGRepresentation()' возвращал значение, отличное от 'nil', потому что оно может фактически возвратить' nil', если изображение не имеет данных или использует неподдерживаемый формат растрового изображения. –

ответ

1

Эта линия:

NSString *query = [NSString stringWithFormat:@"insert into t1 values (null,?)", data ]; 

всегда будет приводить к этой строке:

insert into t1 values (null,?) 

Как -stringWithFormat: не понимаю, что вы пытаетесь привязать данные к «?» ,

Похоже, что FMDatabase имеет метод -executeQuery:, который принимает переменное количество аргументов. Попробуйте это вместо:

[database executeQuery:@"insert into t1 values (null,?)", data]; 

Если вы вручную открываете базу данных с помощью sqlite3, есть ли исходные данные JPEG?

Предупреждения: Я доступ древнего раздела в моем мозге, так как я не сделал базы данных в течение нескольких лет;)

+0

Отлично! Спасибо :) Ты запустил меня на правильном пути. Оказывается, вам нужно вызвать метод executeUpdate и использовать с ним переменные аргументы вместо того, чтобы заранее создать строку с помощью метода stringWithFormat, поскольку она даст неправильную строку запроса, как вы заметили. –

Смежные вопросы