2016-07-25 67 views
0

我創建了這個參數化查詢,完美工作。現在,當一個string和一個頂點過去了,我得到這個錯誤Android SQLite SELECT語法錯誤apex

SQLiteException: near "'%'": 

THI是查詢

String sql = "SELECT titolo, icona, colore, tipo, identificativo, dato_campo FROM table " + 
      "WHERE titolo LIKE '%" + parametro + "%' " + 
      "OR dato_campo LIKE '%" + parametro + "%' GROUP BY identificativo"; 

如果parametro正是這種類型stringa'的字符串,我得到的錯誤。

我該如何解決?

+0

請添加您完全崩潰日誌 – USKMobility

回答

2

問題是你的字符串有一個單引號字符,它會破壞你的SQL查詢字符串。

模擬parametro == test01 - OK

"SELECT titolo, icona, colore, tipo, identificativo, dato_campo FROM table WHERE titolo LIKE '%test01%' OR dato_campo LIKE '%test01%' GROUP BY identificativo"; 

模擬parametro == stringa'NOK

"SELECT titolo, icona, colore, tipo, identificativo, dato_campo FROM table WHERE titolo LIKE '%stringa'%' OR dato_campo LIKE '%stringa'%' GROUP BY identificativo"; 

正如你所看到的,你的字符串是生產'%stringa'%'這是一個SQL查詢無效。

在查詢期間,您應該將該字符'轉義爲:%stringa''%'

所以,你可以按如下創建您的查詢字符串前加上一句:

parametro = parametro.replaceAll("\'","''"); 
String sql = "SELECT titolo, icona, colore, tipo, identificativo, dato_campo FROM table " + 
     "WHERE titolo LIKE '%" + parametro + "%' " + 
     "OR dato_campo LIKE '%" + parametro + "%' GROUP BY identificativo"; 

這是一個關於你現在面臨的問題上的支持......正如加布Sechan對對方的回答中提到,生應該不鼓勵查詢。

UPDATE

安全的方式來運行你的查詢是:

String paramentro = "stringa'"; 
Cursor cursor = db.query("tablename", new String [] {"titolo", "icona", "colore", "tipo", "identificativo", "dato_campo"}, "titolo LIKE ? OR dato_campo LIKE ?", new String[]{"%"+paramentro+"%", "%"+paramentro+"%"}, "identificativo", null, null, null); 
1

不要使用連接編寫像這樣的SQL查詢。它使您無法接受SQL注入攻擊。相反,使用綁定參數。這不僅會使您的查詢更高效,而且還會防止SQL注入。