Android 选择:使用参数化查询对id为blob的行进行查询

Android 选择:使用参数化查询对id为blob的行进行查询,android,android-sqlite,Android,Android Sqlite,我有一个sqlite数据库,其中所有行都有一个UUID作为主键,db列定义为BLOB 键作为字节[]而不是字符串插入,以避免浪费。我可以使用SQLiteDatabase.compileStatement和SQLiteStatement上的bindBlob插入、更新和删除行,但我无法找到将blob绑定到SELECT查询参数的方法 SQLiteDatabase.query和.rawQuery都希望我的WHERE参数是字符串,这些字符串永远不会与我的字节数组blob匹配。如果我使用如下BLOB文本手动

我有一个sqlite数据库,其中所有行都有一个UUID作为主键,db列定义为BLOB

键作为字节[]而不是字符串插入,以避免浪费。我可以使用SQLiteDatabase.compileStatement和SQLiteStatement上的bindBlob插入、更新和删除行,但我无法找到将blob绑定到SELECT查询参数的方法

SQLiteDatabase.query和.rawQuery都希望我的WHERE参数是字符串,这些字符串永远不会与我的字节数组blob匹配。如果我使用如下BLOB文本手动构造我的WHERE,我可以找到我的行:

final Cursor query = db.query(getTableName(),
                              getColumns(),
                              "id = X'" + bytesToHex(getByteArrayFromUUID(id)) + "'" ,
                              null,
                              null,
                              null,
                              null);
但是我很容易受到SQL注入的影响


在我使用过的所有其他语言中,SQLite都不是问题,是否真的没有办法用android SQLite获得标准的准备好的SELECT语句?

android SQLite中的大多数API都希望参数是字符串

您可以使用准备查询,然后使用将blob参数绑定到查询。但是,从查询中获得有用的结果并不容易,因为只有一些1x1结果集的方法


另一方面,使用blob作为键似乎不是一个好主意。

compileStatement不返回响应/游标,因此不能用于执行选择查询。另一方面,使用blob作为键似乎不是一个好主意。客户端必须在不与服务器通信的情况下生成唯一的ID,因此我们不能使用INT ID,而是使用UUID。我们可以将UUID存储为文本,但这只会浪费空间,因为二进制BLOB表示只占用16个字节。