2013-05-07 17 views
9

Android SQLiteデータベースのSQLインジェクションを防ぐためにプリペアドステートメントを使用します。しかし、クエリにLikeが含まれ、Where name = ? と一緒に動作する場合、rawqueryがクラッシュすると、Android SQLite dbのようなプリペアドステートメントを使用する方法がありますか?それはありがとう範囲 の外にバインドまたは列のインデックスを与えるAndroid SQLite select * fromテーブルwhere name like%key%プリペアドステートメントを使用

この

はクエリです。

+0

あなたはSQLクエリに「のように」を使用するためにこれをチェックすること http://stackoverflow.com/questions/5752575/cant-use-like-clause-in-android-app –

+1

同様のことができ、rawqueryで動作しますあなたのコードとログを投稿して、どんなエラーが発生したのかを確認することができます。 – Vamshi

答えて

21
if (name.length() != 0) { 

     name = "%" + name + "%"; 
    } 
    if (email.length() != 0) { 
     email = "%" + email + "%"; 
    } 
    if (Phone.length() != 0) { 
     Phone = "%" + Phone + "%"; 
    } 
    String selectQuery = " select * from tbl_Customer where Customer_Name like '" 
      + name 
      + "' or Customer_Email like '" 
      + email 
      + "' or Customer_Phone like '" 
      + Phone 
      + "' ORDER BY Customer_Id DESC"; 

    Cursor cursor = mDb.rawQuery(selectQuery, null);` 
+0

ありがとう、トリックは空の文字列を確認していました。私の一日を救った。通常のクエリでは、空の文字列は問題を引き起こすことはありませんが、準備されたステートメントでは、それは問題ありません。 –

1

は、あなたが "'" の前と後に不足している

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

を試してみてください

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); 
+0

私はそれを試しましたが、まだ同じ問題があります。 android.database.sqlite.SQLiteBindOrColumnIndexOutOfRangeException:範囲外のバインドまたは列インデックス:ハンドル0x1001a58 –

7

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

関連する問題