Android开发:如何简化Java搜索代码 替代大量IF判断优化Room查询
Android Room多条件搜索无冗余实现方案
原有实现问题说明
- 大量if判断覆盖参数组合,冗余度高、后续新增搜索条件维护成本极高
- 自行编写的SQL存在语法错误:嵌套CASE语句未闭合、缺少判断逻辑,将SQL空值
null误写为字符串常量'null',无法和传入的空参数匹配
正确实现方案
1. 修正后的Room DAO查询代码
// 注意将下方的register_date、transaction_date替换为你表中实际存储登记日期、交易日期的字段名 @Query("SELECT * FROM tbl_transaction " + "WHERE (:operation IS NULL OR operation = :operation) " + "AND (:traderName IS NULL OR traderName = :traderName) " + "AND (:searchBy IS NULL OR " + " (CASE :searchBy " + " WHEN '登记日期' THEN register_date " + " WHEN '交易日期' THEN transaction_date " + " END) BETWEEN :startDate AND :endDate)") List<Transaction> getSearchValues(String operation, String traderName, String searchBy, long startDate, long endDate);
2. 简化后的searchHelper代码
不需要再写任何参数组合的if判断,直接组装参数调用DAO即可:
public void searchHelper() { // 提取参数,空串直接转null传给DAO自动跳过对应过滤条件 String sOperationValue = spinnerOperation.getText().toString().trim(); String operation = sOperationValue.isEmpty() ? null : sOperationValue; String sTraderValue = spinnerTraderName.getText().toString().trim(); String traderName = sTraderValue.isEmpty() ? null : sTraderValue; String sSearchByValue = spinnerSearchBy.getText().toString().trim(); String searchBy = sSearchByValue.isEmpty() ? null : sSearchByValue; long startValue = 0; long endValue = 0; // 只有SearchBy不为空时才读取日期参数,符合你的搜索规则 if (searchBy != null) { try { startValue = Long.parseLong(etStartDate.getText().toString().trim()); endValue = Long.parseLong(etEndDate.getText().toString().trim()); } catch (NumberFormatException e) { // 日期格式错误时返回空结果或给用户提示 recyclerViewAdapter.setData(Collections.emptyList()); return; } } // 直接调用DAO查询,自动适配所有参数组合 List<Transaction> searchResult = transactionDao.getSearchValues(operation, traderName, searchBy, startValue, endValue); // 刷新RecyclerView展示结果 recyclerViewAdapter.setData(searchResult); }
实现逻辑说明
- 每个查询条件都加了
参数为NULL OR 字段匹配参数的判断,只要传入的参数为null,该条件就会自动跳过,自动适配所有参数组合场景 - 日期部分用CASE语句根据
searchBy参数动态选择要匹配的日期字段,完全符合搜索规则要求 - 后续新增搜索条件只需要在WHERE语句后新增一行对应的
(:新参数 IS NULL OR 字段 = :新参数)即可,维护成本极低
内容的提问来源于stack exchange,提问作者Reza
相关产品推荐
相关产品推荐

