Android:如何使用非字符串选择参数查询SQLiteDatabase?

Android:如何使用非字符串选择参数查询SQLiteDatabase?,android,sql,select,sqlite,Android,Sql,Select,Sqlite,有没有一种简单的方法可以使用非字符串类型的选择参数查询SQLiteDatabase 特别是:如果arg是字节[]类型 我能找到的最接近的东西是SQLiteDatabase.compileStatement(),它返回一个SQLiteStatement,您可以在上调用bindBlob等。不幸的是,SQLiteStatement不适合查询,因为它不返回游标 SQLiteCursor看起来很有希望,但我不知道如何使用它。这是Android数据库API中的一个设计缺陷 query和rawQuery仅接受

有没有一种简单的方法可以使用非字符串类型的选择参数查询
SQLiteDatabase

特别是:如果arg是
字节[]
类型

我能找到的最接近的东西是
SQLiteDatabase.compileStatement()
,它返回一个
SQLiteStatement
,您可以在上调用
bindBlob
等。不幸的是,
SQLiteStatement
不适合查询,因为它不返回游标


SQLiteCursor
看起来很有希望,但我不知道如何使用它。

这是Android数据库API中的一个设计缺陷

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

您可以做的是忽略参数,并手动设置blob的格式:

cursor=db.rawQuery(“从b中选择a,其中c=x'112233',空);
您也可以尝试

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);
Cursor cs=db.rawQueryWithFactory(新CursorFactory(){
@SuppressLint(“新API”)
@抑制警告(“弃用”)
@凌驾
公共游标newCursor(SQLiteDatabase db、SQLiteCursorDriver masterQuery、,
字符串编辑表,SQLiteQuery查询){
//把它绑在这里!。。。
bindBlob(1,mac);
if(Build.VERSION.SDK_INT<11){
返回新的SQLiteCursor(db、masterQuery、editTable、query);
}否则{
返回新的SQLiteCursor(masterQuery、editTable、query);
}
}
},查询,空,DB_表);

基于blob的查询听起来效率极低。你确定这是写查询的唯一方法吗?是的。它不一定是一个大blob。有没有一种方法可以表达在WHERE子句中包含blob的查询?暂时忘掉Android吧:在普通SQL中如何实现这一点?好问题。字节文字是否可以以某种方式在sql语句中表示?虽然我现在无法验证,但SQLite C api似乎确实允许通过预处理语句进行查询,您可以通过sqlite3_bind_blob将blob绑定到预处理语句。如果要使用
bindBlob()
方法,您必须实现自己的
sqlitecursordrive
。这是一个不错的解决方案。但在最后一行的参数中发送null将通过异常进行处理。必须以数组形式发送参数