2011-12-19 166 views
1

從Android SQLite數據庫的角度來看 - 我有一個表有一個BLOB類型的字段,然後我想根據這個BLOB字段來查詢這個表內容。SQLite查詢與字節[] WHERE子句

我可以用ContentValues插入我的BLOB字段,並使用檢索:

cursor.getBlob(0)// index 

我只是無法弄清楚如何查詢在此基礎上BLOB字段此表中的內容,並沒有發現任何有關此問題。

回答

2

您無法查詢blob的(text?binary?other?)內容。

如果你看看,你會看到的內容是十六進制:

實例:X'53514C697465' 。

意見建議:

創建一個新的文本列,例如: 「blob_index」。您可以在「索引」列上搜索,然後獲取blob。

另外,只需將數據存儲爲「文本」即可。

0

我發現你可以在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); 
}