循环遍历游标的返回值时出现意外结果

时间:2017-01-03 03:43:52

标签: java android sql sqlite android-studio

我有一个游标,通过以下方式返回一个加倍的双等价于SELECT SUM(balance) FROM accounts WHERE accountName="accountY" OR description="descriptionX"

public Double itemSum(String[] sumCriteria) {
    Cursor cursor = mainAccountsDatabase.rawQuery("SELECT SUM(balance) FROM accounts WHERE ?=? OR description=?",
            new String[]{sumCriteria[0], sumCriteria[1], sumCriteria[2]});

    if (cursor.moveToFirst()) {
        return cursor.getDouble(0);
    }
    return null;
}

在我的Java代码中,我有以下内容:

public void dbGenerator(AccountAdapterView adapter, String filter1, String filter2, String filter3) {
    NumberFormat formatter = NumberFormat.getCurrencyInstance();
    for (int i = 0; i < listFromDB.size(); i++) {
        ListParser newAccount;
        String accountNameDisplay = listFromDB.get(i).getaccountName();
        String descriptionDisplay = listFromDB.get(i).getDescription();
        Double balanceCompare = maSource.itemSum(new String[]{"accountName",accountNameDisplay,accountNameDisplay, "null"});
        Double balance = listFromDB.get(i).getBalance();
        String formatted = formatter.format(balance);
        newAccount = new ListParser(accountNameDisplay, descriptionDisplay, formatted);
        adapter.add(newAccount);
    }
}

其中listFromDB是预先填充的ListArray,其中包含来自数据库"accountName"列的帐户名称。

检查logcat 10个样本行的第一个输出会导致第一个填充的列表项与"description"列匹配的未编号值,以及后面的9个和为0。

如果我对10行中的每一行执行SQL,我会得到正确的总和。为什么光标提供不同的输出?

以下是数据外观的小型表示。

accountName,description,balance
account1,description1,500
account2,description2,20
account3,description3,-68
account4,account1,-1000
account5,description4,400
account6,account2,180

1 个答案:

答案 0 :(得分:0)

itemSum 中的总和对我来说是正确的。

您可能需要发布到logcat中以查看每个总和值是此行

  Double balanceCompare = maSource.itemSum(new String[]
 {"accountName",accountNameDisplay,accountNameDisplay, "null"});

在循环内部。

现在,你为什么要这样做

Double balanceCompare = maSource.itemSum(new String[]{"accountName",accountNameDisplay,accountNameDisplay, "null"});
newAccount = new ListParser(accountNameDisplay, descriptionDisplay, formatted);
        adapter.add(newAccount);

如果balanceCompare本身未被调用(未填充)到ListParser。我的意思是ListParser's构造函数接受accountNameDisplay, descriptionDisplay, formatted,那么balanceCompare呢?

也许你的意思是(而不是)

// balanceCompare ?
String formatted = formatter.format(balanceCompare );
        newAccount = new ListParser(accountNameDisplay, descriptionDisplay, formatted);

此外,如果召回,占位符仅在应用于某些值时才相关,因此?的第一个WHERE ?=?无法绑定。