2012-01-16 16 views
11

私はAndroidアプリケーションを開発しています。私はSqliteデータベースを使ってビットマップをいくつか保存しています。ユーザーがアプリケーションをインストールしたときに、いくつかの画像が自動的に挿入されるようにしたい。SQLite - BLOBを挿入ステートメントで挿入できますか?

私はこのようなSQLiteOpenHelperクラスを使用しています:

public class DatabaseHelper extends SQLiteOpenHelper { 

... 

DatabaseHelper(Context context, String nameOfDB, int version, String[] scriptSQLCreate, 
     String scriptSQLDelete) { 
    super(context, nameOfDB, null, version); 

    this.scriptSQLCreate = scriptSQLCreate; 
    this.scriptSQLDelete = scriptSQLDelete; 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    int numScripts = scriptSQLCreate.length; 
    for(int i = 0; i<numScripts; i++){ 
    Log.i(TAG,"Creating database, executing script " + i); 
    db.execSQL(scriptSQLCreate[i]); 
    } 
} 
} 

...

私はそうのようになることの上に示されscriptSQLCreateパラメータに定数を渡したい:

private static final String[] SCRIPT_DATABASE_CREATE = { 
    "create table memes( id integer primary key autoincrement," + 
        + " img blob not null," + 
        + " name text not null unique)" , 
    "insert into memes(img,name) values(BITMAP1,'1.jpg')", 
    "insert into memes(img,name) values(BITMAP2,'2.jpg')", 
    "insert into memes(img,name) values(BITMAP3,'3.jpg')"}  

} 

どのようなヘルプも非常に感謝します。

Thxを、 闘莉王ザーンあなたは非常に長い六角を使用することができますし、あなたが本当に、本当にしたい場合は

答えて

16

リテラルリテラルブロブとして:

insert into memes(img, name) values(X'0102030405060708090a0b0c0d0e0f', '1.jpg') 

しかし、これは通常は悪い考えです。代わりにparameterised queriesをご覧ください。彼らはあなたが一度代わりに実際の値のプレースホルダを使用して文をコンパイルしてみましょう、そしてそれを何度も再利用し、必要に応じてプレースホルダを埋めます:

SQLiteStatement p = sqlite.compileStatement("insert into memes(img, name) values(?, ?)"); 

byte[] data = loadData("1.jpg"); 
p.bindBlob(1, data); 
p.bindString(2, "1.jpg"); 
p.execute(); 

byte[] data = loadData("2.jpg"); 
p.bindBlob(1, data); 
p.bindString(2, "2.jpg"); 
p.execute(); 

(警告---コードテストされていません。)

一般に、SQLインジェクション攻撃を避けるための確かな方法であるため、どこでもというパラメータ化クエリを使用する必要があります。また、通常はより簡単で分かりやすくなります。文字列をつなぎ合わせることでSQLクエリを組み立てることは、まったく避けてください。

+0

Humm、あなたのアプローチは間違いなく面白いです。たとえ数ビットの数ではなく、数百のビットマップでデータベースをあらかじめ準備する必要がある場合は、さらに多くのことが起こります。その場合、何百もの挿入ステートメントを持つことは非常に実用的ではありません。私はあなたのアプローチをテストしますが、まずそれらの画像をどこに置くべきかという問題に対する解決策を考え出す必要があります。それらをたくさん持っている場合には、それらをドロウアブルフォルダに置くだけでは非常に実用的ではないようです。 – tulio84z

+1

あなたのプロジェクト内のアセットディレクトリは---そこにファイルとしてアクセスできるAPIがあります。ファイルシステム上の実際のファイル:http://developer.android.com/reference/android/content/res/AssetManager.html –

0

あなたのデータテーブルには、見ることができないのの不可視の単語があります。 sqliteのnavicatのようなdbツールでdbファイルをチェックしてください。表のエラーワードに注意してください。