2016-12-12 3 views
0

ich auf Android arbeiten, und ich bin Verwendung von SQLite-Datenbank beschlagen. Ich wusste bereits, wie man Operationen wie Abfrage einfügen usw. für die Datenbank ausführt.Verwenden Blob-Feld als Abfrageparameter in SQLite

Nur zum Beispiel an, dass die folgenden Tabellendefinition haben:

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

Dann SQL-Abfrage auszuführen ist:

SELECT id, column_bean FROM bean84_b WHERE column_bean=? 

Der Code java oben Abfrage auszuführen ist:

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

Kann eine BLOB-Spalte wie der SELECT-Parameter verwendet werden?

Antwort

1

Dies ist ein Designfehler in dem Android-Datenbank-API.

Abfrage und rawQuery akzeptieren nur String-Parameter. execSQL akzeptiert alle Objektparameter, gibt aber keine Ergebnisse zurück. SQLiteStatement akzeptiert Parameter eines beliebigen Typs, lässt jedoch nur Abfragen zu, die einen einzelnen Wert zurückgeben.

Ein anderer Typ Sie Blob mit einem anderen Feldern http://www.programcreek.com/java-api-examples/index.php?api=android.database.sqlite.SQLiteStatement

In der Android-Datenbank-API binden kann, ExecSQL() ist die einzige Funktion, wo die Parameter sind nicht String [], sondern Object []:

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

Dies ist nicht eine Antwort auf die Frage liefert. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlasse einen Kommentar unter seinem Beitrag. - [Aus der Bewertung] (/ Review/minderwertigen-posts/14566024) – Joseph

+0

@ Joseph ich habe Update Antwort –

+1

Hallo, scheint es, dass Sie diese Antwort von http://stackoverflow.com/a/20919258 kopiert und https://marc.info/?l=sqlite-users&m=141597860701828&w=4. Sie verwenden die Arbeit eines anderen, ohne dem Autor etwas zu verraten. Dies führt zu Plagiaten und ist bei Stack Overflow nicht erwünscht. Denken Sie daran, ** immer ** prominente Attribution hinzuzufügen, wenn Sie andere Quellen verwenden. Vielen Dank! –

0

Ja, es ist möglich. Sie müssen einfach CursorFactory erweitern, Werte an seine SQLiteQuery binden, die in der NewCursor-Methode verfügbar sein wird.

Xamarin Code-Schnipsel:

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); 
    } 
} 

Verbrauch:

dbInstance.RawQueryWithFactory(new SQLiteCursorFactory(selectionArgs), query, null, null); 
Verwandte Themen