Android SQLite SELECT语法错误顶点

时间:2016-07-25 19:00:31

标签: android sqlite select

我创建了这个完美的参数查询。现在,当一个字符串与顶点一起传递时,我收到此错误

SQLiteException: near "'%'":

这是查询

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',我收到错误。

我该如何解决?

2 个答案:

答案 0 :(得分:2)

问题是你的String有一个单引号字符会破坏你的SQL查询字符串。

模拟parametro == test01 - 确定

"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";

这是对您现在面临的问题的支持......正如Gabe Sechan在另一个答案中提到的那样,应该不鼓励原始查询。

<强>更新

运行查询的安全方法是:

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 :(得分:1)

不要使用串联编写这样的SQL查询。它让您对SQL注入攻击持开阔态度。而是使用绑定参数。这不仅可以提高查询效率,还可以防止SQL注入。