我正在使用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);
答案 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';
命令已注释掉,因此由于工具的工作原理而显示了结果
例如,如果您想搜索任何与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);