在Bloite中使用Blob字段作为查询参数

时间:2016-12-12 01:05:09

标签: java android sql sqlite

我正在使用Android,而且我正在研究使用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);

是否可以使用SELECT参数这样的BLOB列?

2 个答案:

答案 0 :(得分:1)

这是Android数据库API中的设计错误。

query和rawQuery只接受字符串参数。 execSQL接受任何Object参数但不返回结果。 SQLiteStatement接受任何类型的参数,但只允许返回单个值的查询。

另一种类型,您可以将blob与另一个字段绑定 http://www.programcreek.com/java-api-examples/index.php?api=android.database.sqlite.SQLiteStatement

在Android数据库API中,execSQL()是唯一的函数所在 参数不是String []而是Object []:

data.table

答案 1 :(得分: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);