9

Android SQLite データベースでの SQL インジェクションを防ぐために、準備済みステートメントを使用したいと考えています。Likeただし、クエリに含まれている場合に rawquery がクラッシュしWhere name = ? 、Android SQLite db で like および prepare ステートメントを使用する方法はありますか?

これはクエリです:

sqlQuery = "SELECT * FROM " + TABLE_CALLS + " where " + CALLER_NAME + " like ? COLLATE NOCASE or " + CALLER_NBR + " like ? or " + CALLER_EXT + " like ?" + " or " + IS_OUTGOING + " like ?  COLLATE NOCASE or " + TYPE + " like ? COLLATE NOCASE";

Cursor cursor = database.rawQuery(sqlQuery, new String[]{"%" + criterion + "%", "%" + criterion + "%","%" + criterion + "%","%" + criterion + "%","%" + criterion + "%"});

範囲外のバインドまたは列インデックスを与えます ありがとうございます。

4

3 に答える 3

7

試す

Cursor cursor = database.rawQuery(sqlQuery, new String[]{"'%" + criterion + "%'", 
   "'%" + criterion + "%'",
   "'%" + criterion + "%'",
   "'%" + criterion + "%'",
   "'%" + criterion + "%'"});

前後の「 ' 」が抜けています。

于 2013-05-07T11:04:04.030 に答える
1

のようにしてみてください..

String[] a = new String[5];
a[0]       = '%' + criterion + '%';
a[1]       = '%' + criterion + '%';
a[2]       = '%' + criterion + '%';
a[3]       = '%' + criterion + '%';
a[4]       = '%' + criterion + '%';
Cursor cursor = database.rawQuery(sqlQuery,a);
于 2013-05-07T10:51:25.560 に答える