3

リモートサイトから(URLから)いくつかの画像を表示する必要があるiOSアプリを作成しています。ユーザーが画像を表示する画面に入るたびに、ダウンロードが完了するまでアプリがフリーズします。そこで、ダウンロード済みの画像をCOVERSという名前のSQLiteテーブルに保存したいと思います。

画像をダウンロードして表示する方法は次のとおりです。

movieCoverがUIImageViewであり、オブジェクトムービーに、ダウンロードする画像のURLを含むcoverという名前のNSURLプロパティがあるとします。

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をチェックしてください-バイナリブロブを保存して引き出す方法を示しています(例としてサファリアイコンを使用)」。

于 2012-05-05T02:59:36.580 に答える