【发布时间】:2012-01-23 09:25:13
【问题描述】:
从 Android SQLite 数据库的角度来看 - 我有一个表,它有一个 BLOB 类型的字段,然后我想根据这个 BLOB 字段查询这个表的内容。
我可以使用ContentValues 插入我的 BLOB 字段并使用以下方法检索它:
cursor.getBlob(0)// index
我只是不知道如何根据这个 BLOB 字段查询这个表的内容,也没有发现这个问题。
【问题讨论】:
从 Android SQLite 数据库的角度来看 - 我有一个表,它有一个 BLOB 类型的字段,然后我想根据这个 BLOB 字段查询这个表的内容。
我可以使用ContentValues 插入我的 BLOB 字段并使用以下方法检索它:
cursor.getBlob(0)// index
我只是不知道如何根据这个 BLOB 字段查询这个表的内容,也没有发现这个问题。
【问题讨论】:
您无法查询 blob 的(文本?二进制?其他?)内容。
如果你看,你会看到内容是十六进制的:
示例:X'53514C697465'。
建议:
创建一个新的文本列,例如“blob_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); }
【讨论】: