2016-12-12 2 views
0

Я работаю над Android, и я изучаю использование базы данных SQLite. Я уже знал, как сделать операцию, например, создать запрос вставки и т. Д. Для базы данных.Использование поля BLOB в качестве параметра запроса в SQLite

Просто к примеру, предположим, что иметь следующее определение таблицы:

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

Возможно ли использовать столбец BLOB, например, параметр SELECT?

ответ

1

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

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

Другой тип вы можете связать блоб с другими полями http://www.programcreek.com/java-api-examples/index.php?api=android.database.sqlite.SQLiteStatement

В связи с API Android базы данных, ExecSQL() является единственной функцией, где параметры не являются String [], но Object []:

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

Это не дает ответа на этот вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. - [Из обзора] (/ review/low-quality-posts/14566024) – Joseph

+0

@Joseph У меня есть ответ на вопрос –

+1

Привет, кажется, что вы скопировали этот ответ с http://stackoverflow.com/a/20919258 и https://marc.info/?l=sqlite-users&m=141597860701828&w=4. Вы используете чужую работу, не предоставляя автору кредит. Это означает плагиат и не приветствуется в переполнении стека. Не забывайте ** всегда ** добавлять заметные атрибуты при использовании других источников. Благодаря! –

0

Да, это возможно. Вы должны просто расширить CursorFactory, привязать значения к его SQLiteQuery, которые будут доступны в методе NewCursor.

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); 
Смежные вопросы