SQL UNION联表查询时点击ListView第二表词条fragment显示空值问题
问题原因及修复方案
核心bug点
- SQL占位符参数数量不匹配
你在getWordForAll方法中构造的SQL语句用了2个?占位符,但是调用rawQuery时只传入了1个参数,导致第二个表的查询条件永远匹配失败,所以属于table2的词条查询结果为空。 getAllTableName2返回值错误
你注释说明getAllTableName2方法逻辑和getAllTableName1一致,按照现有逻辑getAllTableName1在全局搜索模式下返回的是lang1表名,如果getAllTableName2逻辑完全相同,会导致第二个查询的表名错误,无法查到lang2的词条。- 额外小问题:查询结果用
while循环如果出现两个表同名词条会被覆盖,且没有关闭Cursor会导致内存泄漏。
修复代码
1. 修复getWordForAll方法
public Word getWordForAll(String word, int dicType) { String tableName1 = getAllTableName1(dicType); String tableName2 = getAllTableName2(dicType); String q = "SELECT * FROM "+ tableName1 +" WHERE word = ? UNION SELECT * FROM " + tableName2 + " WHERE word = ?"; // 占位符有2个,传入2个参数 Cursor result = mDB.rawQuery(q, new String[]{word, word}); Word word1 = new Word(); // 改用moveToFirst,不需要循环避免覆盖,用完关闭Cursor if (result.moveToFirst()) { word1.word = result.getString(result.getColumnIndexOrThrow(COL_WORD)); word1.definition = result.getString(result.getColumnIndexOrThrow(COL_DEFINITION)); } result.close(); return word1; }
2. 修正getAllTableName2方法
// 调整返回值为lang2表名 public String getAllTableName2(int dicType) { String tableName2 = ""; if (dicType == R.id.action_all) { tableName2 = lang2; } return tableName2; }
修复完成后重新运行即可正常加载table2词条的单词和释义。
内容的提问来源于stack exchange,提问作者Zed Hakdog
相关产品推荐
相关产品推荐

