1

SQLite データベースにブロブがあります。入力すると:

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"ます。これらの 8 文字と null ターミネータを足すと 9 バイトになります。あなたがこれを言うとき:

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 に答える