Android 如何组合从用户表单条目中获取的合理SQL查询? 我正在把一个按钮函数组合在一起,运行一个SQL查询,但我觉得我可以用更有效的方式来做。

Android 如何组合从用户表单条目中获取的合理SQL查询? 我正在把一个按钮函数组合在一起,运行一个SQL查询,但我觉得我可以用更有效的方式来做。,android,sql,Android,Sql,我的表单如下所示: 我运行视图的代码是: public void customViewAction(View view){ String QueryFull = null; String QueryCostFull = null; String QueryStart = "SELECT * FROM expenses "; String QueryCostStart = "SELECT SUM(Cost) FROM expenses "; if

我的表单如下所示:

我运行视图的代码是:

    public void customViewAction(View view){

    String QueryFull = null;
    String QueryCostFull = null;
    String QueryStart = "SELECT * FROM expenses ";
    String QueryCostStart = "SELECT SUM(Cost) FROM expenses ";

    if(allTimeButton.isSelected() && descriptionSpinner.getSelectedItem().equals("All")){
        QueryFull = QueryStart+";";
        QueryCostFull = QueryCostStart+";";
    }else if (allTimeButton.isSelected() && !descriptionSpinner.getSelectedItem().equals("All")){
        QueryFull = QueryStart+"WHERE Description = " + "'"+(String)descriptionSpinner.getSelectedItem()+"';";
        QueryCostFull = QueryCostStart+"WHERE Description = " + "'"+(String)descriptionSpinner.getSelectedItem()+"';";
    }else if (betweenButton.isSelected() && descriptionSpinner.getSelectedItem().equals("All")){
        QueryFull = QueryStart+"WHERE Purchase_Date between '"+fromDate+"' AND '"+toDate+"';";
        QueryCostFull= QueryCostStart+"WHERE Purchase_Date between '"+fromDate+"' AND '"+toDate+"';";
    }else if (betweenButton.isSelected() && !descriptionSpinner.getSelectedItem().equals("All")){
        QueryFull = QueryStart+"WHERE Purchase_Date between '"+fromDate+"' AND '"+toDate+"' AND Description = '" + (String)descriptionSpinner.getSelectedItem()+"';";
        QueryCostFull = QueryCostStart+"WHERE Purchase_Date between '"+fromDate+"' AND '"+toDate+"' AND Description = '" + (String)descriptionSpinner.getSelectedItem()+"';";
    }
}
我还没有添加else if,它将考虑最低和最高价格,我意识到它将开始变得非常混乱,所以我想知道你们是否可以建议更智能、更高效的方法来组合SQL查询以运行


提前感谢您的帮助。

此解决方案的标准方法是将四个变量声明为应用程序允许的最小/最大值:

String dateMin = '01-01-2000';
String dateMax = datetime.today();
然后,当您从表单中读取数据时,在适当的地方更新这些变量,即

if (dateRangeIsSelected) {
    dateMin = fromDate;
    dateMax = toDate;
}
这样,您的查询在结构上总是相同的——只需使用这4个变量格式化即可

' ... WHERE PurchaseDate between ' + dateMin + ' AND ' + dateMax ' ... '

我不是Java开发人员,所以请仔细检查我的语法。但下面是一种更可持续地处理逻辑的方法。仅在需要时添加过滤器注意!对于所有,1=1,这总是正确的。同样的代码不要写两次

String strSelectAll = "SELECT * ";
String strSelectSum = "SELECT SUM(Cost) ";
String strFrom = "FROM expenses WHERE 1=1 ";
String strWhere = null;

if(!descriptionSpinner.getSelectedItem().equals("All")){
strWhere = strWhere + "' AND Description = '" + (String)descriptionSpinner.getSelectedItem() + "' ";
}

if(betweenButton.isSelected()) {  
    strWhere = strWhere + " And Purchase_Date between '" + fromDate + "' AND '" + toDate + "' ";
}

strWhere = strWhere + "' AND Cost between " + minCost + " AND " + maxCost;

strSelectAll = strSelectAll + strFrom + strWhere + ";";
strSelectSum = strSelectSum + strFrom + strWhere + ";";

嗯,对不起,没有完全理解你想说的话?但是如果没有选择datRange,它将是“。。。其中PurchaseDate介于“+null+”和“+null”…”之间??这会导致一个错误,对吗?不,这就是为什么你要手动设置变量的上限和下限。如果从未选择日期范围,则查询将是PurchaseDate在01-01-2000和datetime之间的位置。今天感谢您的帮助,如果没有成本输入,是否可以正确运行?或者如果只输入了一个成本?如果成本是可选的,则将其包装到另一个if语句中。对最小值和最大值单独执行一个操作,并使用>=和