如何搜索序列化对象作为数据库查询?

时间:2018-07-01 13:58:53

标签: android sqlite android-sqlite sqliteopenhelper

我正在使用SQLite数据库存储对象。为此,我只是将该对象转换为byte []并将其放入数据库中。

但是当我从数据库中检索该对象时,它给了我这个错误。

无法识别的令牌:“ [B @ 457637e”(代码1):,而在编译时:SELECT * FROM ContentList WHERE subjectNumber = 0 AND subjectTypeNumber = 0 AND content = [B @ 457637e 存储字节[]已创建一个包含BLOB的列 最初,我正在将该对象搜索到一个空数据库中

byte[] data = SerializationUtils.serialize(Object);
Cursor cursor = sqLiteDatabase.rawQuery("SELECT * FROM " + 
    DbContract.TABLE_NAME + " WHERE " + DbContract.SUBJECT_NUMBER + "=" + subjectNumber + 
    " AND " + DbContract.SUBJECT_TYPE_NUMBER + "=" + subjectTypeNumber + " AND " + 
    DbContract.CONTENT + "=" + data, null);

1 个答案:

答案 0 :(得分:0)

您需要提供字节数组作为查询的适当值,例如x'ff0099AA'。

例如考虑下面的SQL,该SQL删除并创建一个表,然后用BLOBS插入几行,然后搜索这些blob之一:-

DROP TABLE IF EXISTS table_with_blob;
CREATE TABLE IF NOT EXISTS table_with_blob (blob_column BLOB);
INSERT INTO table_with_blob VALUES(x'FFFFFFFF'),(x'EEEEEEEE'),(x'DDDDDDDD');
SELECT * FROM table_with_blob WHERE blob_column = x'EEEEEEEE';

这将导致单行被发现: enter image description here

  • 命令已注释掉,因此由于工具的工作原理而显示了结果

  • 例如,如果您想搜索任何与LIKE x'EE%'等效的BLOBS,Blob的使用效果就不好了(请注意,它将无法使用,并且会导致语法错误),您可以执行以下操作:-

    • SELECT *,rowid AS rid FROM table_with_blob WHERE substr(blob_column,1,1) = x'EE';
  • 请注意,substr函数的开始和长度表示的是字节数,而不是十六进制字符串的字符数/ 4位/半字节数。

最简单的方法不是编写将字节数组转换为十六进制字符串的方法,而是让查询便捷方法代表您进行转换为十六进制字符串。

所以代替:-

byte[] data = SerializationUtils.serialize(Object);
Cursor cursor = sqLiteDatabase.rawQuery("SELECT * FROM " + 
    DbContract.TABLE_NAME + " WHERE " + DbContract.SUBJECT_NUMBER + "=" + subjectNumber + 
    " AND " + DbContract.SUBJECT_TYPE_NUMBER + "=" + subjectTypeNumber + " AND " + 
    DbContract.CONTENT + "=" + data, null);

您可能有:-

byte[] data = SerializationUtils.serialize(Object);
String whereclause = DbContract.SUBJECT_NUMBER + "=? AND " +
    DbContract.SUBJECT_TYPE_NUMBER + "=? AND " +
    DbContract.CONTENT + "=?";
String[] whereargs = new String[]{subjectNumber,subjectTypeNumber,data}
Cursor = sqLiteDatabase.query(
             DbContract.TABLE_NAME,
             null, //<<<< all columns
             whereclause,
             whereargs,
             null,null,null
);
  • 请注意,上面的代码是内部代码,未经测试,因此可能包含一些错误。
  • 检索内容列的数据时,您需要使用getBlob方法,例如mybytearray = getBlob(DbContract.CONTENT);