2011-04-19 19 views
15

在android中我使用以下語句。Android的SQLiteException:綁定或列索引超出範圍問題

model = dataHelper.rawQuery("SELECT _id, engword, lower(engword) as letter FROM word WHERE letter >= 'a' AND letter < '{' AND engword LIKE '%" + filterText + "%'", new String[ {"_id","engword", "lower(engword) as letter"}); 

它扔android.database.sqlite.SQLiteException: bind or column index out of range: handle 0x132330

什麼是我的代碼的問題?

回答

39

正確的說法是:

model = dataHelper.rawQuery(" 
    SELECT _id, engword, lower(engword) as letter 
    FROM word W 
    HERE letter >= 'a' 
    AND letter < '{' 
    AND engword LIKE ? ORDER BY engword ASC 
    ", 
    new String[] {"%" + filterText + "%"} 
); 
22

您提供了3個參數,但在查詢中沒有?。傳遞null而不是字符串數組作爲第二個參數傳遞給rawQuery?

1更換_idengwordlower(engword) as letter在您選擇的字符串)

model = dataHelper.rawQuery("SELECT ?, ?, ? FROM word WHERE letter >= 'a' AND letter < '{' AND engword LIKE '%" + filterText + "%'",new String[] {"_id","engword", "lower(engword) as letter"}); 

2)

model = dataHelper.rawQuery("SELECT _id, engword, lower(engword) as letter FROM word WHERE letter >= 'a' AND letter < '{' AND engword LIKE '%" + filterText + "%'", null); 

編輯: 正如@Ewoks指出的那樣,選項(1)不正確,因爲預準備語句只能得到參數(?s)在WHERE子句中。

+0

應該是什麼聲明:模型= dataHelper.rawQuery(「選擇,? FROM word WHERE lower(engword)> ='a'AND lower(engword)<'{'AND engword LIKE'%「+ filterText +」%'「,null); – 2011-04-19 13:43:39

+0

在我的答案中添加了代碼片段 – ernazm 2011-04-19 14:05:19

+1

@dev_android u can在WHERE子句中添加?(參數).. – Ewoks 2012-12-04 08:56:11

3

如果有人跟我一樣試圖(和失敗),以獲得這與getContentResolver().query在這裏工作我是怎麼做的:

* 更新多虧了@評論CL和@Wolfram Rittmeyer,因爲他們說這是一樣的rawQuery *

正確方法:

public static String SELECTION_LIKE_EMP_NAME = Columns.EMPLOYEE_NAME 
      + " like ?";    

    Cursor c = context.getContentResolver().query(contentUri, 
       PROJECTION, SELECTION_LIKE_EMP_NAME, new String[] { "%" + query + "%" }, null); 

以前的答案,這是開放的SQL注入攻擊:

public static String SELECTION_LIKE_EMP_NAME = Columns.EMPLOYEE_NAME 
      + " like '%?%'"; 

String selection = SELECTION_LIKE_EMP_NAME.replace("?", query); 

Cursor c = context.getContentResolver().query(contentUri, 
      PROJECTION, selection, null, null); 
+0

這是錯誤的,並會引入格式化問題並允許[SQL注入攻擊](http://xkcd.com/327/)。您應該將'sensorId'放入'selectArgs'。 – 2013-10-11 15:05:27

+0

嗯,好點好Re:SQLInjection,但其他答案也是如此(不是辯護,只是說)當你說'錯'我不清楚你的意思嗎?它確實有效。 d喜歡使用'selectionArgs'只是不起作用 – scottyab 2013-10-11 16:43:18

+0

This w與'rawQuery'完全相同。 – 2013-10-11 22:12:16

相關問題