0

私は空のカーソルを与えるこの rawQuery を書きました:

String query = "SELECT * FROM " + TBL_NAME + " WHERE ? = ?";
String[] args = new String[] {COL_NAME, Long.toString(id)};
Cursor c = db.rawQuery(query, args);

しかし、次のクエリを実行すると、期待どおりの結果が得られます。

String query = "SELECT * FROM " + TBL_NAME + " WHERE " + COL_NAME + " = " + Long.toString(id);
Cursor c = db.rawQuery(query, null);

「rawQuery」メソッドの引数の 1 つとしてテーブル名を使用できないことがわかりました。しかし、なぜそうでないのかはわかりません(引数を「 」で囲んでいると思いますが、推測にすぎません)。

それ以外は、クエリにユーザー入力を含めるためにのみ引数を使用する必要があるという結論に達しましたSQLiteStatement

要約すると、rawQuery で args を使用する必要がある場所 (および可能であれば理由) は、(単に文字列に連結するのではなく) 必要があります。また、SQLiteStatement (または単にクエリ) の代わりに rawQuery を使用する必要があるのはなぜですか?

4

1 に答える 1

1

私の知る限り、COL_NAME は「?」に置き換えることはできません。Android は「?」のみを使用します。「選択」ではなく「引数」として

final String query = "SELECT * FROM " + TBL_NAME + " WHERE COL_NAME=?";
final String[] args = new String[] {Long.toString(id)};
final Cursor c = db.rawQuery(query, args);

または、この方法を使用することをお勧めします

query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)

あなたの場合、次のようになります。

final String[] args = new String[] {Long.toString(id)};
final Cursor c = db.query(TBL_NAME, null, COL_NAME + "=?", args, null, null, null);
于 2013-05-21T08:45:10.423 に答える