1

我在 SQLite 数据库中有一个 Blob。当我输入:

Select length(blobblob) FROM Database WHERE id=9387134648;

我得到了20519 字节的大小(相当大),但是当我使用 android 获取 Blob 时:

Cursor cursor = database.rawQuery("Select ? FROM Database WHERE id=?;",
                new String[]{"blobblob", "9387134648"});

if (cursor.moveToNext()) {
    byte[] bytes = cursor.getBlob(0);
    Log.v("Bloblength", String.valueOf(bytes.length));
}

我只得到9 个字节的大小。

做错什么?

4

1 回答 1

1

我猜您从"blobblob"查询中获取字符串(作为字节数组),这八个字符加上一个空终止符将是九个字节。当你这样说时:

select ? from database where id = ?

两个占位符都将被您的参数中的值替换,并且参数是Strings ,因此?将替换为 SQL 字符串。结果将是一个有效的查询:

select 'blobblob' from database where id = '9387134648'

该查询所做的只是'blobblob'从您的表中选择 SQL 字符串文字。

根本问题是您不能在查询中为 SQL 标识符(表名、列名等)使用占位符,占位符仅用于字符串和数字等值。您的代码应该看起来更像这样:

Cursor cursor = database.rawQuery("Select blobblob FROM Database WHERE id=?;",
                new String[]{"9387134648"});

我不太喜欢 Java 或 Android,所以希望我没有破坏代码。

于 2013-07-28T19:55:37.463 回答