С точки зрения базы данных Android SQLite - у меня есть таблица с полем типа BLOB, а затем я хочу запросить содержимое этой таблицы на основе этого поля BLOB.
Я могу вставить свое поле BLOB с помощью ContentValues
и извлечь его, используя:
cursor.getBlob(0)// index
Я просто не могу понять, как запросить содержимое этой таблицы на основе этого поля BLOB и ничего не нашел об этой проблеме.
Вы не можете запросить (textual? Binary? Other?) Содержимое blob.
Если вы посмотрите, вы увидите, что содержимое находится в шестнадцатеричном виде:
ПРИМЕР: X'53514C697465 '.
Предложения:
Создайте новый текстовый столбец, например "blob_index". Вы можете выполнить поиск в столбце "index", а затем получить blob.
В качестве альтернативы просто сохраните данные как "текст".
Я обнаружил, что вы можете запросить blob. Нужно использовать функцию hex() в запросе.
Например, я использую UUID в своих строках базы данных как уникальный ключ, который я могу создать локально и все еще быть уверенным в уникальности на сервере.
CREATE TABLE example (_ID INTEGER PRIMARY KEY AUTOINCREMENT, uuid BLOB NON NULL UNIQUE, ...)
При вставке данных выполняются следующие работы:
final ContentValues values = new ContentValues(4); values.put(Contract.Line.COL_UUID, UuidFactory.toBlob(uuid));
Учитывая URI запроса в форме:
content://package.example.com/example/uuid/11112222-3333-0444-0555-666677778888
запрос будет выглядеть следующим образом:
final SQLiteDatabase db = mHelper.getReadableDatabase(); return db.query(table, projection, "hex(uuid) = ?", new String[] { UuidFactory.toHex(uri.getLastPathSegment()) }, null, null, null, null);
В UuidFactory
(который также содержит код для генерации новых UUID) следующие статические функции определяются следующим образом:
@NonNull public static String toHex(@NonNull final UUID uuid) { return String.format("%016X%016X", uuid.getMostSignificantBits(), uuid.getLeastSignificantBits()); } @NonNull public static String toHex(@NonNull final String uuid) { return toHex(UUID.fromString(uuid)); } @NonNull public static byte[] toBlob(@NonNull final UUID uuid) { final ByteBuffer buf = ByteBuffer.allocate(16); buf.putLong(uuid.getMostSignificantBits()); buf.putLong(uuid.getLeastSignificantBits()); return buf.array(); }
И для полноты:
@NonNull public static UUID fromBlob(@NonNull final byte[] array) { final ByteBuffer buf = ByteBuffer.allocate(16); buf.mark(); buf.put(array); buf.reset(); final long msb = buf.getLong(); final long lsb = buf.getLong(); return new UUID(msb, lsb); }