Android开发中如何实现Cursor仅选取值不重复的单元格
实现Cursor读取去重的方案
针对你需要跳过KEY_AREA列重复值、仅保留首次出现内容的需求,有两种可直接落地的实现方式,优先推荐数据库层面去重的方案,执行效率更高:
方案1:查询阶段直接返回去重结果(推荐)
直接在数据库查询时开启去重逻辑,返回的Cursor本身就不存在重复的KEY_AREA值,不需要额外写遍历判重代码,数据量越大性能优势越明显。
修改后的查询代码如下:
// 开启distinct去重,按KEY_AREA分组保证列值唯一 Cursor cursor = database.query( true, DBHelper.TABLE_AREA, columns, null, null, DBHelper.KEY_AREA, null, null, null ); if (cursor.moveToFirst()) { do { Area_Names.add(cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.KEY_AREA))); } while (cursor.moveToNext()); } else { Log.d("mLog", "0 rows"); } cursor.close();
方案2:遍历阶段内存判重(适配不能修改原查询的场景)
如果业务逻辑要求必须保留原查询的全量返回结果,就在遍历时用HashSet记录已经出现过的值,仅将首次出现的内容加入列表即可,完全匹配你举例的输出顺序:
// 记录已经出现过的区域值 HashSet<String> existedValues = new HashSet<>(); Cursor cursor = database.query(DBHelper.TABLE_AREA, columns, null, null, null, null, null, null); if (cursor.moveToFirst()) { do { String currentValue = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.KEY_AREA)); // add方法返回true代表值不存在,是首次出现 if (existedValues.add(currentValue)) { Area_Names.add(currentValue); } } while (cursor.moveToNext()); } else { Log.d("mLog", "0 rows"); } cursor.close();
该方案会严格按照Cursor的遍历顺序保留值的首次出现记录,你示例中重复的第二个Car、第二个Beer都会被直接跳过,最终得到的列表顺序就是
Beer、Car、House、Tree,和预期完全一致。
内容的提问来源于stack exchange,提问作者Argaros
相关产品推荐
相关产品推荐

