SQLite查询大体可以分两种,一是拼完整语句,二是用封装好的方法用数组传参。
不说废话,先上一段可以用的示例代码(数组传参):
String[] selectioinArgs = {"%"+keyword+"%"};//注意:这里没有单引号
String sql = "select "+ TABLE_COLUMN_NAME +"," +TABLE_COLUMN_SYSTEM_NAME+ " from " + TABLE_NAME
+ " where " + TABLE_COLUMN_NAME + " like ? ";
Cursor cursor = db.rawQuery(sql,selectioinArgs);
或者(直接拼完整sql) String sql2 = "select "+ TABLE_COLUMN_NAME +"," +TABLE_COLUMN_SYSTEM_NAME+ " from " + TABLE_NAME
+ " where " + TABLE_COLUMN_NAME + " like '%"+keyword+"%'";//注意:这里有单引号
Cursor cursor2 = db.rawQuery(sql2,null);
第二种因为是直接完整的SQL语句,没太多问题,第一种这里的可能发生的错误有几个:
1. String[] selectionArgs = {"'%"+keyword+"%'"} 这个数组比上面的正确的多了一堆单引号"'",导致的结果是单引号被加入匹配串,实际匹配串成了"
like ''%keyword%''",意思为必须包含两边是单引号和中间任意关键字。问题出在多了一对单引号。
2.sql语句后半段:" where " + TABLE_COLUMN_NAME + " like '?' "
这种情况下会报一个异常,大致意思是说“你没说需要参数,可是你又硬给我一个参数,劳资不干了!”。问题就出在问号不应该用单引号包裹。
原因:
我们使用SQLite查询的时候用的"where xxx = ?"来指定条件,我们知道如果"?部分"是String 类型时,是需要单引号引起来的。
经过几个错误的语句可以判断出,"?" 的前后位置必须是空格或者逗号,否则会把?和连着的字符整体当做一个String对象,而不是后补参数空位 。
经过几个错误的语句可以判断出,"?" 的前后位置必须是空格或者逗号,否则会把?和连着的字符整体当做一个String对象,而不是后补参数空位 。