2014-01-03 1 views
4

Есть ли простой способ запросить SQLiteDatabase с аргументами выбора, которые не являются String типами?Android: как запросить SQLiteDatabase с аргументами выбора не строки?

В частности: если arg является byte[]?

Ближайшая вещь, которую я могу найти, это SQLiteDatabase.compileStatement(), которая возвращает SQLiteStatement, вы можете позвонить bindBlob и т.п. К сожалению, SQLiteStatement не подходит для запросов, потому что он не возвращает курсор.

SQLiteCursor выглядит многообещающим, но я не могу понять, как его использовать.

+0

запрашивая, основанный на сгустка звучит ужасно неэффективен. Вы уверены, что это единственный способ написать свой запрос? – ianhanniballake

+0

Да. Это не обязательно большой капля. – Steveo

+0

Есть ли способ даже * выразить * запрос, который имеет BLOB в своем предложении WHERE? Забудьте Android на данный момент: как бы вы это сделали в обычном SQL? – CommonsWare

ответ

7

Это ошибка дизайна в API баз данных Android.

query и rawQuery принимают только строковые параметры. execSQL принимает любые Object параметры, но не возвращает результаты. SQLiteStatement принимает параметры любого типа, но допускает только запросы, возвращающие одно значение.

Что вы можете сделать, это игнорировать параметры, и форматировать сгустки, как blob literals вручную:

cursor = db.rawQuery("SELECT a FROM b WHERE c = x'112233'", null); 
1

также вы можете попробовать

Cursor cs = db.rawQueryWithFactory(new CursorFactory() { 
      @SuppressLint("NewApi") 
      @SuppressWarnings("deprecation") 
      @Override 
      public Cursor newCursor(SQLiteDatabase db, SQLiteCursorDriver masterQuery, 
        String editTable, SQLiteQuery query) { 

       // bind it here!... 
       query.bindBlob(1, mac); 



       if (Build.VERSION.SDK_INT < 11) { 
        return new SQLiteCursor(db, masterQuery, editTable, query); 
       } else { 
        return new SQLiteCursor(masterQuery, editTable, query); 
       } 
      } 
     }, query, null, DB_TABLE); 
Смежные вопросы