使用 byte[] WHERE 子句的 SQLite 查询

发布于 2024-12-21 21:04:52 字数 251 浏览 0 评论 0原文

从 Android SQLite 数据库的角度来看 - 我有一个表,其中有一个 BLOB 类型的字段,然后我想根据这个 BLOB 字段查询该表的内容。

我可以使用 ContentValues 插入我的 BLOB 字段并使用以下方法检索它:

cursor.getBlob(0)// index

我只是不知道如何根据此 BLOB 字段查询此表内容,并且没有发现任何有关此问题的信息。

From an Android SQLite database point of view - I have a table which has a field with BLOB type and then I want to query this table contents based on this BLOB field.

I can insert my BLOB field using ContentValues and retrieve it using:

cursor.getBlob(0)// index

I just can't figure out how to query this table contents based on this BLOB field and have found nothing about this problem.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

自由如风 2024-12-28 21:04:52

您无法查询 blob 的(文本?二进制?其他?)内容。

如果您查看,您会看到内容是十六进制的:

示例:X'53514C697465'。

建议:

创建一个新的文本列,例如“blob_index”。您可以搜索“索引”列,然后获取 blob。

或者,只需将数据存储为“文本”。

You can't query the (textual? binary? other?) contents of a blob.

If you look, you'll see the contents is in hex:

EXAMPLE: X'53514C697465'.

Suggestions:

Create a new text column, e.g. "blob_index". You can search on the "index" column, then fetch the blob.

Alternatively, just store the data as "text".

烟燃烟灭 2024-12-28 21:04:52

我发现你可以查询 blob。需要在查询中使用 hex() 函数。

例如,我在数据库行中使用 UUID 作为唯一键,我可以在本地生成该键,并且仍然确保服务器上的唯一性。

创建表示例(_ID INTEGER PRIMARY KEY AUTOINCRMENT,
                      uuid BLOB 非空唯一,
                      ...)

插入数据时,执行以下操作:

最终 ContentValues 值 = new ContentValues(4);
值.put(Contract.Line.COL_UUID,
           UuidFactory.toBlob(uuid));

给定以下形式的查询 URI:

content://package.example.com/example/uuid/11112222-3333-0444-0555-666677778888

查询变为:

最终 SQLiteDatabase db = mHelper.getReadableDatabase();
返回 db.query(表、投影、
                “十六进制(uuid)=?”,
                new String[] { UuidFactory.toHex(uri.getLastPathSegment()) },
                空,空,空,空);

UuidFactory (其中还包含生成新 UUID 的代码)中,定义了以下静态函数:

<前><代码>@NonNull
公共静态字符串toHex(@NonNull最终UUID uuid){
返回 String.format("%016X%016X",
uuid.getMostSignificantBits(),
uuid.getLeastSignificantBits());
}

@非空
公共静态字符串toHex(@NonNull最终字符串uuid){
返回 toHex(UUID.fromString(uuid));
}

@非空
公共静态字节[] toBlob(@NonNull最终UUID uuid){
最终 ByteBuffer buf = ByteBuffer.allocate(16);
buf.putLong(uuid.getMostSignificantBits());
buf.putLong(uuid.getLeastSignificantBits());
返回 buf.array();
}

为了完整性:

<前><代码>@NonNull
公共静态 UUID fromBlob(@NonNull Final byte[] array) {
最终 ByteBuffer buf = ByteBuffer.allocate(16);
buf.mark();
buf.put(数组);
buf.reset();
最终长 MSB = buf.getLong();
最终长 lsb = buf.getLong();
返回新的 UUID(msb, lsb);
}

I found that you can query on a blob. One needs to use the hex() function on the query.

For example I'm using UUIDs in my database rows as a unique key that I can generate locally and still be sure of uniqueness on the server.

CREATE TABLE example (_ID INTEGER PRIMARY KEY AUTOINCREMENT,
                      uuid BLOB NON NULL UNIQUE,
                      ...)

When inserting data the following works:

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

Given a query URI in the form:

content://package.example.com/example/uuid/11112222-3333-0444-0555-666677778888

the query becomes:

final SQLiteDatabase db = mHelper.getReadableDatabase();
return db.query(table, projection,
                "hex(uuid) = ?",
                new String[] { UuidFactory.toHex(uri.getLastPathSegment()) },
                null, null, null, null);

In UuidFactory (which also contains the code to generate new UUIDs) the follow static functions are defined thus:

@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();
}

And for completeness:

@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);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文