Как я могу сохранить и извлечь изображение (байты) в 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-объект (на примере иконки сафари)".