2

私のアプリケーションimagesでは、database.
私のデータベース フィールド タイプは blob です。

データの保存はimageうまくいきますが、image data以下のコードを使用してデータベースから取得すると

   NSData *photodata=[[NSData alloc] initWithBytes:sqlite3_column_blob(compiledStmt, 12) length:sqlite3_column_bytes(compiledStmt, 12)];

しかし、フィールドには null データが含まれており、null 値の代わりに <3c3e> が返されます。
そして、以下のクエリを使用してデータを挿入しました

   strQuery_DB = [NSString stringWithFormat:@"update tbl_project_review set answer ='%@',comment ='%@',photodata='%@' where prjid=%d",temp,escapedStr1,tempdata,prjid];
4

3 に答える 3

2

%@メソッドで指定子を使用すると、それぞれの引数stringWithFormat:のメソッドが呼び出されます。descriptionオブジェクトの場合、これはとNSDataで囲まれたデータの 16 進表現を返します。空のオブジェクトの場合、文字列が返され、これがデータベースに挿入されます。画像データのサイズが不必要に 2 倍になるため、これはおそらくやりたいことではありません。<>NSData<>

などのパラメーター化されたクエリ関数を使用する必要がありますsqlite_bind_blob。これにより、データ入力の処理が容易になります。基本的に、更新クエリを次のように変更する必要があります (適切なエラー チェックを追加するなど)。

const char sql[] = "update tbl_project_review set answer = ?, comment = ?, photodata = ? where prjid = ?";
sqlite3_stmt *stmt = NULL;
sqlite3_prepare_v2(db, sql, sizeof sql, &stmt, NULL);

sqlite3_bind_text(stmt, 1, [tmp UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(stmt, 2, [escapedStr1 UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_blob(stmt, 3, [tempdata bytes], [tempdata length], SQLITE_TRANSIENT);
sqlite3_bind_int(stmt, 4, prjid);

sqlite3_step(stmt); // check for SQLITE_DONE 
于 2012-12-06T07:55:48.150 に答える
2

画像をブロブとしてDBに保存するのは悪い手順です。イメージをキャッシュ ディレクトリに保存する必要があり、イメージのパスを DB に保存する必要があります。

于 2012-12-06T05:21:46.723 に答える
0

以下は、データベースから画像を取得するための簡単なコードです。

                NSString *imgurl=[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)];
                int length = sqlite3_column_bytes(compiledStatement, 4);
//                NSData *data       = [NSData dataWithBytes:sqlite3_column_blob(compiledStatement, 4) length:length];
                NSString *imageString=[NSString stringWithCharacters:sqlite3_column_blob(compiledStatement, 4) length:length];
                UIImage *personImage=[UIImage imageNamed:imageString];

これがお役に立てば幸いです...

于 2012-12-06T05:27:53.857 に答える