Как искать сериализованный объект как запрос к базе данных? - PullRequest
0 голосов
/ 01 июля 2018

Я использую базу данных SQLite для хранения объекта. Для этого я просто преобразовал этот объект в byte [] и поместил его в базу данных.

Но когда я получаю этот объект из базы данных, он выдает мне эту ошибку.

нераспознанный токен: "[B @ 457637e" (код 1): при компиляции: SELECT * FROM ContentList WHERE subjectNumber = 0 И subjectTypeNumber = 0 И содержимое = [B @ 457637e для хранения байта [] a создали поле, содержащее 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 голосов
/ 01 июля 2018

Вам необходимо предоставить байтовый массив как соответствующее значение для запроса, например. x'ff0099AA.

например. рассмотрим следующий 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

  • Команды закомментированы, поэтому результат показан из-за того, как работает инструмент

  • С блобами не так хорошо работать, например, если вы хотите найти любые BLOB-объекты, эквивалентные LIKE x'EE% '(обратите внимание, что это не сработает и приведет к синтаксической ошибке ) вы бы сделали что-то вроде: -

    • 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...