3

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

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

假设movieCover是一个UIImageView,并且对象movie有一个名为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 是 AppDelegate 的一个属性,它使用 FMDB 来操作数据库中的数据。

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

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

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

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

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

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

4

2 回答 2

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 的回答。

于 2014-08-22T01:35:07.060 回答
0

查看 FMDB 发行版中的 main.m - 它展示了如何保存和提取二进制 blob(以 safari 图标为例)”。

于 2012-05-05T02:59:36.580 回答