2011-12-19 6 views
1

Android SQLite 데이터베이스 관점에서 - BLOB 유형의 필드가있는 테이블이 있고이 BLOB 필드를 기반으로이 테이블 내용을 쿼리하려고합니다.byte [] WHERE 절을 사용하는 SQLite 쿼리

나는 ContentValues를 사용하여 내 BLOB 필드를 삽입하고 사용하여 검색 할 수 있습니다

cursor.getBlob(0)// index 

난 그냥이 BLOB 필드에 따라이 테이블 내용을 조회하고이 문제에 대해 아무것도 발견되지 않은 방법을 알아낼 수 없습니다.

답변

2

블롭의 (텍스트? 바이너리? 기타) 내용을 쿼리 할 수 ​​없습니다.

당신이 보는 경우 내용을 볼 수는 진수에 있습니다

예 : X'53514C697465 '.

제안 :

새로운 텍스트 열을 생성, 예를 들어, "blob_index". "색인"열을 검색 한 다음 얼룩을 가져올 수 있습니다.

또는 데이터를 "텍스트"로 저장하십시오.

0

블롭에서 쿼리 할 수있는 것으로 나타났습니다. 쿼리에서 hex() 함수를 사용해야합니다.

예를 들어, 데이터베이스에서 UUID를 고유 한 키로 사용하여 로컬에서 생성 할 수 있고 서버의 고유성을 확신 할 수 있습니다.

CREATE TABLE example (_ID INTEGER PRIMARY KEY AUTOINCREMENT, 
         uuid BLOB NON NULL UNIQUE, 
         ...) 
데이터 다음 작품을 삽입 :

content://package.example.com/example/uuid/11112222-3333-0444-0555-666677778888 
,691 : 형태의 쿼리 URI 감안할 때

final ContentValues values = new ContentValues(4); 
values.put(Contract.Line.COL_UUID, 
      UuidFactory.toBlob(uuid)); 

363,210

쿼리된다 :

고정 기능을 수행 (새로운 UUID를 생성하는 코드를 포함) UuidFactory에서
final SQLiteDatabase db = mHelper.getReadableDatabase(); 
return db.query(table, projection, 
       "hex(uuid) = ?", 
       new String[] { UuidFactory.toHex(uri.getLastPathSegment()) }, 
       null, null, null, null); 

따라서 정의된다

@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); 
} 
관련 문제