2017-01-03 59 views
0

的返回值循环时出现意外的结果我有一个游标,以下列方式返回总结双equivalane到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,包含DB的"accountName"列中的帐户名称。

检查logcat 10个示例行结果的第一输出在其中所述第一填充的列表的条目相匹配"description"柱和以下的9个和是0

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

下面是数据外观的一个小表示。

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

“检查logcat 10个样本行的第一个输出会导致第一个已填充列表项与”description“列匹配的未取得的值,并且以下9个和为0。 - 你可能想扩大这个。很难看到你的问题,特别是因为你没有提供'getBalance' –

+0

关于引用的文本,在我的示例数据中有'account1'作为第一个accountName。第二列中有'account4'作为accountName和'account1'作为描述。我会得到那-1000我的第一笔总和然后0休息。至于getBalance只是一个从ListArray'listFromDB'中获取余额的getter,没什么特别之处。我还输出了正在发送到'itemSum'的'accountName'和'description',这一切都是按顺序的。 – Leb

回答

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 ?=?第一?无法绑定相关。

+0

我把这个确切的东西输入到logcat中,这是我看到的值是他们是什么。 'balanceCompare'是作为最近的东西来添加的,最终它会完全按照你展示它的方式。起初我输出帐户并开始平衡。现在我正在总结那些itemSum出现的地方发生的所有交易。即使输出到我的logcat的正确信息正在发送到itemSum – Leb

+0

这是令我困惑的事情,如果您的db *中的accountName' doesn不匹配*,但它匹配“说明”,而不是?以你的示例中的第4行为例,你将'account1'传入函数,然后'account1'与你的示例的第4行不匹配,但是当你使用'OR description'时,第4行也将被采用。顺便说一句,为什么'description'包含其中一个对应的帐户名? –