SQLite-запрос с предложением byte [] WHERE - PullRequest
1 голос
/ 19 декабря 2011

С точки зрения базы данных Android SQLite - у меня есть таблица с полем типа BLOB, и затем я хочу запросить содержимое этой таблицы на основе этого поля BLOB.

Я могу вставить свое поле BLOBиспользуя ContentValues и извлеките его с помощью:

cursor.getBlob(0)// index

Я просто не могу понять, как запросить содержимое этой таблицы на основе этого поля BLOB и ничего не нашел об этой проблеме.

Ответы [ 2 ]

2 голосов
/ 19 декабря 2011

Вы не можете запросить (текстовое? Двоичное? Другое?) Содержимое большого двоичного объекта.

Если вы посмотрите, вы увидите, что содержимое в шестнадцатеричном формате:

ПРИМЕР:X'53514C697465 '.

Предложения:

Создайте новый текстовый столбец, например, "blob_index".Вы можете выполнить поиск по столбцу «index», а затем получить BLOB-объект.

Либо просто сохраните данные в виде «text».

1 голос
/ 13 августа 2017

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