2012-03-16 27 views
0

次のコード私はDBに画像を保存するために書いています。SQLiteに画像を保存する

NSString *insertSQL = [NSString stringWithFormat: @"INSERT INTO slamDetailsTable (name, gender, phone,email,movie,abt,dob,smiley1,smily2,smily3,image) VALUES (\"%@\",\"%@\",\"%@\",\"%@\",\"%@\",\"%@\",\"%@\",\"%@\",\"%@\",\"%@\",?)", contact.name, contact.gender, contact.phone,contact.email,contact.movies,contact.abtMe,contact.dob,contact.smiley1,contact.smiley2,contact.smiley3]; 
     NSLog(@"query %@",insertSQL); 
     const char *insert_stmt = [insertSQL UTF8String]; 

     sqlite3_prepare_v2(database, insert_stmt, -1, &statement, NULL); 
     sqlite3_bind_blob(statement, 1, [contact.imageData bytes], [contact.imageData length], NULL); 
     if (sqlite3_step(statement) == SQLITE_DONE) 
     { 
      NSLog(@"Row added"); 
     } 

     else { 
      NSLog(@"Failed to add row"); 
     } 

私は次の行を追加してイメージを取得しています。

NSData *imageDataFromDb = [[NSData alloc]initWithBytes:sqlite3_column_blob(statement, 11) length:sqlite3_column_int(statement, 11)]; 

しかし、 0バイトを示すimageDataFromDb。

答えて

2

ブロブの長さを取得するには、sqlite3_column_int()を使用しないでください。使用する正しい呼び出しはsqlite3_column_bytes()です。

結果がBLOBまたはUTF-8文字列である場合、 sqlite3_column_bytes()ルーチンは、 BLOBまたは文字列のバイト数を返します。

+0

私はどちらの場合でもqlite3_column_bytes()を使用しますか? – Shreedhar

+0

@Shreedharテストなしで見ることができる限り、あなたの文章は大丈夫です。読んでいるときは、sqlite3_column_intを使用すると長さが間違ってしまうでしょう(これは、blobを整数に変換しようとします。それは返すでしょう) –

+0

0バイトを示すStill imageDataFromDb。 – Shreedhar

0

私はいつもデバイスに画像を保存し、その画像の名前や場所をデータベースに保存することがこれよりはるかに効率的な方法であることを発見しました。大規模な画像をSQLiteデータベースに保存することは、非常に時間がかかることがあります。

+0

私にそのような例を教えてもらえますか? – Shreedhar

+0

今、デバイスにファイルを保存し、そのファイルの文字列をdbに保存する方法については、Googleには記載されていません。これの主な問題は、ファイルが実際に存在するかどうかを確認することです。画像をアプリケーションバンドルに含めるか、アプリ内でダウンロードすることができます。 –

関連する問題