2011-12-19 3 views
1

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

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

cursor.getBlob(0)// index 

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

ответ

2

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

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

Пример: X'53514C697465.

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

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

В качестве альтернативы просто сохраните данные как «текст».

0

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