如何在SQLite数据库多列搜索字符串并将结果展示在ListView?
问题分析与修复方案
让我看看你的代码,问题主要出在两个地方:
1. WHERE子句未包含COMMENT列的搜索条件
你现在的查询只对KEY_QUESTION和KEY_ANSWER做了模糊匹配,但完全没把KEY_COMMENT加进去,自然不会返回评论列含有关键词的记录。
2. 占位符与参数数量不匹配
你的WHERE语句里有两个?占位符,但whereArgs数组只传了一个searchString。这种参数不匹配的情况会导致数据库执行查询时出错,最终可能只会生效第一个条件(也就是只搜索QUESTION列),甚至直接抛出异常。
修正后的代码
public Cursor search(String searchString) { String[] columns = new String[]{ KEY_QUESTION, KEY_ANSWER, KEY_COMMENT }; // 把COMMENT列也加入WHERE条件,并且每个LIKE都对应一个占位符 String where = KEY_QUESTION + " LIKE ? OR " + KEY_ANSWER + " LIKE ? OR " + KEY_COMMENT + " LIKE ?"; searchString = "%" + searchString + "%"; // 每个占位符都需要对应一个参数,这里要传三次searchString String[] whereArgs = new String[]{ searchString, searchString, searchString }; Cursor cursor = null; try { if (database == null) { database = openHelper.getReadableDatabase(); } cursor = database.query(TABLE_FLASH, columns, where, whereArgs, null, null, null); } catch (Exception e) { Log.d(TAG, "SEARCH EXCEPTION! " + e); } return cursor; }
改动说明
- 在WHERE子句末尾添加了
OR KEY_COMMENT LIKE ?,让查询覆盖三列。 whereArgs数组现在包含三个相同的searchString,对应三个?占位符,保证参数数量匹配。
这样修改后,只要任意一列包含你输入的关键词,对应的记录就会被检索出来啦。
内容的提问来源于stack exchange,提问作者AndroPro
相关产品推荐
相关产品推荐

