2016-12-12 1 views
0

私はAndroidで作業しています。私はSQLiteデータベースの使用を勉強しています。私はすでにデータベースのためのクエリの挿入などを作成するような操作を行う方法を知っていた。SQLiteのクエリパラメータとしてBlobフィールドを使用

ただ、例えば、次の表の定義を持っているとします

CREATE TABLE bean84_b (id INTEGER PRIMARY KEY AUTOINCREMENT, column_bean BLOB); 

次に実行するSQLクエリは次のとおりです。

SELECT id, column_bean FROM bean84_b WHERE column_bean=? 

問い合わせの上で実行するJavaコードは次のとおりです。

byte[] param1=... 
String[] args={String.valueOf(param1)}; 
Cursor cursor = database(). rawQuery("SELECT id, column_bean FROM bean84_b WHERE column_bean=?", args); 

SELECTパラメータと同様にBLOB列を使用できますか?

答えて

1

これはAndroidデータベースAPIのデザインバグです。

クエリとrawQueryは文字列パラメータのみを受け入れます。 execSQLは任意のObjectパラメータを受け取りますが、結果は返しません。 SQLiteStatementは任意の型のパラメータを受け取りますが、単一の値を返すクエリのみを許可します。

あなたはAndroidのデータベースAPIで別のフィールド http://www.programcreek.com/java-api-examples/index.php?api=android.database.sqlite.SQLiteStatement

でブロブをバインドすることができます別のタイプ、ExecSQLメソッドは() パラメータがString []が、[]オブジェクトではありません唯一の機能は次のとおりです。

byte[] blob = ...; 
    db.execSQL("DELETE FROM t WHERE my_blob = ?", new Object[]{ blob }); 
+0

。批評をしたり、著者の説明を求めるには、投稿の下にコメントを残してください。 - [レビューの投稿](レビュー/低品質の投稿/ 14566024) – Joseph

+0

@Joseph私は更新の回答が –

+1

ありがとう、こんにちは、これはhttp://stackoverflow.com/a/20919258とhttps: /marc.info/?l=sqlite-users&m=141597860701828&w=4あなたは著者のクレジットを与えずに他の人の作品を使っています。これは盗作になり、スタックオーバーフローを歓迎しません。他のソースを使用する場合は、**常に**著名なアトリビューションを追加することを忘れないでください。ありがとう! –

0

はい、可能です。単にCursorFactoryを拡張して、NewCursorメソッドで使用できるSQLiteQueryに値をバインドする必要があります。

Xamarinのコードスニペット:

internal sealed class SQLiteCursorFactory : Java.Lang.Object, SQLiteDatabase.ICursorFactory 
{ 
    private Dictionary<int, object> _selectionArgs; 

    internal SQLiteCursorFactory(Dictionary<int, object> selectionArgs) 
    { 
     _selectionArgs = selectionArgs; 
    } 

    ICursor SQLiteDatabase.ICursorFactory.NewCursor(SQLiteDatabase db, ISQLiteCursorDriver masterQuery, string editTable, SQLiteQuery query) 
    { 
     foreach(var key in _selectionArgs.Keys) 
     { 
      var val = _selectionArgs[key]; 
      if(val == null) 
      { 
       query.BindNull(key); 
      } 
      else if(val is int) 
      { 
       query.BindLong(key, (int)val); 
      } 
      else if (val is long) 
      { 
       query.BindLong(key, (long)val); 
      } 
      else if (val is double) 
      { 
       query.BindDouble(key, (double)val); 
      } 
      else if (val is string) 
      { 
       query.BindString(key, (string)val); 
      } 
      else if (val is byte[]) 
      { 
       query.BindBlob(key, (byte[]) val); 
      } 
     } 
     return new SQLiteCursor(masterQuery, editTable, query); 
    } 
} 

使用法:これは、質問への答えを提供していません

dbInstance.RawQueryWithFactory(new SQLiteCursorFactory(selectionArgs), query, null, null); 
関連する問題