如何使用FMDB保存并检索图像(字节)到SQLite(blob)?

我正在制作一个需要从远程站点(从URL)显示一些图像的iOS应用程序,每当用户进入应显示图像的屏幕时,应用程序将冻结,直到下载完成。 所以我想将已下载的图像存储到名为COVERS的SQLite表中。

这里是我如何下载和显示图像的代码:

假设movieCover是一个UIImageView ,而对象电影有一个叫做cover的NSURL属性,它包含了要下载的图像的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是使用FMDB来操作DataBase中的数据的AppDelegate的属性。

我需要使用以下方法获取先前保存在数据库中的封面:

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

但是,如果没有保存的封面,则返回零。

所以我需要使用该方法保存封面

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

但是我不知道如何编写这个方法。 需要一些帮助。

方法基于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的回答。

查看FMDB发行版中的main.m – 它显示了如何保存和提取一个二进制blob(使用safari图标作为例子)“。