Как я могу сохранить и извлечь изображение (байты) в SQLite (blob) с помощью FMDB?

Я делаю приложение для iOS, которое должно показывать некоторые изображения с удаленного сайта (из URL), и каждый раз, когда пользователи заходят на экран, который должен показывать изображение, приложение останавливается до завершения загрузки. Поэтому я хочу сохранить уже загруженные изображения в таблицу SQLite с именем COVERS.

Вот код, который я загружаю и показываю изображение:

Предположим, что movieCover - это UIImageView, а у объекта movie есть свойство NSURL с именем cover, которое содержит URL-адрес загружаемого изображения.

NSData *cover = [[NSData alloc] initWithContentsOfURL:movie.cover];
movieCover.image = [[UIImage alloc] initWithData:cover];

Но я хочу изменить это на что-то вроде этого:

NSData *cover = [appDelegate.dataBase getCoverForMovie:movie];
if( !cover ) {
    cover = [[NSData alloc] initWithContentsOfURL:movie.cover];
    [appDelegate.dataBase setCover:cover ToMovie:movie];
}

movieCover.image = [[UIImage alloc] initWithData:cover];

Предположим, что appDelegate является свойством текущего ViewController, а dataBase - это свойство AppDelegate, которое использует FMDB для манипулирования данными в базе данных.

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

- (NSData *)getCoverForMovie:(Movie *)movie;

Но, если обложка не сохранена, верните ноль.

Поэтому мне нужно сохранить обложку, используя метод

- (BOOL)saveCover:(NSData *)cover ForMovie:(Movie *)movie;

Но я не знаю, как кодировать этот метод. Нужна помощь с этим.

2 ответа

Решение

Методы Реализации, основанные на примерах fmdb.m

- (NSData *)getCoverForMovie:(Movie *)movie
{
    NSData *cover = nil;

    FMDatabase *db = [FMDatabase databaseWithPath:databasePath];

    [db open];
    FMResultSet *results = [db executeQueryWithFormat:@"SELECT * FROM COVERS WHERE movie = %i", movie.movieID];

    if([results next])
    {
        cover = [results dataForColumn:@"cover"];
    }

    return cover;
}


- (BOOL)saveCover:(NSData *)cover ForMovie:(Movie *)movie
{
    BOOL result;

    FMDatabase *db = [FMDatabase databaseWithPath:databasePath];

    [db open];

    result = [db executeUpdate:@"INSERT OR REPLACE INTO COVERS (movie, cover) VALUES (?,?)", movie.movieID, cover];

    return result;
}

Спасибо @ccgus за его ответ.

Проверьте main.m в дистрибутиве FMDB - он показывает, как сохранить и извлечь двоичный BLOB-объект (на примере иконки сафари)".

Другие вопросы по тегам