UIImage из PNG двоичного файла от BLOB SQlite. Двоичный файл создан из PHP Fread. Нулевая проблема - PullRequest
3 голосов
/ 20 августа 2011

Я пытаюсь загрузить изображения png в UIImage из базы данных SQlite.Изображения хранятся в виде двоичных файлов в столбце BLOB-объектов.Я создал двоичные файлы с использованием PHP fread, поэтому я думаю, что мой первый вопрос: это форма вывода, которую сможет использовать цель c?Если это не вызывает проблем, то где-то в моем объектном коде c должна быть ошибка.

Вот как я загружаю данные:

NSData *data = [[NSData alloc] initWithBytes:sqlite3_column_blob(selStmt, 2) length:sqlite3_column_bytes(selStmt, 2)];

Когда я NSLog данных, яЯ могу видеть числа (длинный список) для 7 изображений, которые у меня есть в настоящее время.Я предполагаю, что получаю данные из столбца.

Странно то, что когда я отправляю эти данные в UIImage, я получаю нули:

item.archThumb = [UIImage imageWithData:data];

или

UIImage *theimage = [[UIImage alloc]init];
theimage =[UIImage imageWithData:data]; 

Мой второй вопрос: я пропустил дополнительный шаг?

Вот метод, который я использую для чтения элементов из базы данных:

-(void)readItems{
if (!database) return; // earlier problems

// build select statement
if (!selStmt)
{
    const char *sql = "SELECT items.arch_id, items.arch_name, arch_thumbs.thumbs_image FROM items LEFT JOIN arch_thumbs ON items.arch_id = arch_thumbs.thumbs_arch_id ORDER BY items.arch_name ASC;";
    if (sqlite3_prepare_v2(database, sql, -1, &selStmt, NULL) != SQLITE_OK)
    {
        selStmt = nil;
    }
}
if (!selStmt)
{
    NSAssert1(0, @"Can't build SQL to read items [%s]", sqlite3_errmsg(database));
}

// loop reading items from list
int ret;
while ((ret=sqlite3_step(selStmt))==SQLITE_ROW) 
{ // get the fields from the record set and assign to item
    // primary key
    NSInteger n = sqlite3_column_int(selStmt, 0); 
    Item *item = [[Item alloc] initWithPrimaryKey:n]; // create item
    // item name
    char *s = (char *)sqlite3_column_text(selStmt, 1);
    if (s==NULL) s = "";
    item.name = [NSString stringWithUTF8String:(char *)s];

    NSData *data = [[NSData alloc] initWithBytes:sqlite3_column_blob(selStmt, 2) length:sqlite3_column_bytes(selStmt, 2)];

    if (sqlite3_column_blob(selStmt, 2) != NULL) {
    item.archThumb = [UIImage imageWithData:data];
    NSLog(@"the image is:%@", item.archThumb);
    }
    else{
    NSLog(@"read a NULL image");
    }

    [items addObject:item]; // add to list
    [item release]; // free item
    [data release];
}
sqlite3_reset(selStmt); // reset (unbind) statement

}

...