2017-01-03 3 views
0

Ich habe einen Cursor, der einen summierten Doppel equivalane zu SELECT SUM(balance) FROM accounts WHERE accountName="accountY" OR description="descriptionX" auf folgende Weise zurück:Unerwartete Ergebnisse, wenn sie durch den Rückgabewert von Cursor Looping

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; 
} 

In meinem Java-Code habe ich folgendes:

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); 
    } 
} 

Dabei ist listFromDB eine vorbelegte ListArray, die die Namen der Konten aus der Spalte "accountName" des DB enthält.

prüfen logcat die erste Ausgabe der 10 Probenreihen führt zu einem unsummed Wert, wo die erste bevölkerungsListenElement entspricht "description" Spalte und die folgenden 9 Summen sind 0.

Wenn ich die SQL jedem von ausführen die 10 Zeilen bekomme ich die richtige Summe. Warum liefert der Cursor eine andere Ausgabe?

Hier ist eine kleine Darstellung, wie die Daten aussehen.

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

"Wenn logcat die erste Ausgabe der 10 Beispielzeilen überprüft, ergibt sich ein nicht summierter Wert für die Stelle, an der das erste ausgefüllte Listenelement mit der Spalte" description "übereinstimmt und die folgenden 9 Summen 0 sind." - Vielleicht möchten Sie dies erweitern. Es ist schwer, Ihr Problem zu sehen, vor allem, da Sie nicht auch "getBalance" zur Verfügung gestellt haben. –

+0

In Bezug auf den zitierten Text, in meinen Beispieldaten hat 'account1' als der erste accountName. Die zweite Spalte hat "account4" als accountName und "account1" als Beschreibung. Ich würde das -1000 für meine erste Summe und dann 0 für Ruhe bekommen. Wie für getBalance ist nur ein Getter, der das Gleichgewicht aus dem ListArray 'listFromDB' nichts besonderes darüber erhält. Ich habe auch die 'accountName' und' description' ausgegeben, die an 'itemSum' gesendet werden und alles in der richtigen Reihenfolge. – Leb

Antwort

0

Die Summe in der itemSum scheint mir richtig.

Was Sie wahrscheinlich in logcat, um schreiben müssen jeden Summenwert zu sehen, ist diese Linie

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

innerhalb der Schleife selbst. Jetzt

, warum machst du

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

Wenn die balanceCompare selbst nicht aufgerufen wird (nicht gefüllt) in die ListParser. Ich meine der ListParser's Konstruktor akzeptiert accountNameDisplay, descriptionDisplay, formatted, wo ist die balanceCompare dann?

Vielleicht meinen Sie (statt)

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

Auch, wenn Rückruf, Platzhalter nur dann relevant, wenn auf einige Werte angezeigt, so dass der erste ? für die WHERE ?=? nicht gebunden werden konnte.

+0

Ich habe das genaue Ding in logcat eingegeben, so wie ich die Werte sah, was sie sind. "balanceCompare" wurde als eine neue Sache hinzugefügt, um die Summe zu erhalten, letztendlich würde es genau so eingebaut werden, wie Sie es zeigen. Zuerst gab ich den Account aus und startete den Kontostand. Jetzt summiere ich alle Transaktionen, die in denen auftreten, wo itemSum an Ort und Stelle kommt.Ich kann einfach nicht die richtige Summe aus irgendeinem Grund ausgeben, obwohl die richtige Information, die auch an mein Logcat ausgegeben wird, an itemSum gesendet wird. – Leb

+0

Hier ist die Sache, die mich verwirrt, was ist, wenn Ihr 'accountName' in der db * doesn stimmt nicht überein, aber es entspricht stattdessen der 'description'? Nehmen Sie zum Beispiel die vierte Zeile in Ihrem Sample, Sie geben 'account1' in die Funktion ein, dann stimmt' account1' nicht mit der vierten Zeile Ihres Samples überein, aber wenn Sie 'OR description' verwenden, wird auch der vierte genommen. Warum sollte die 'description' übrigens einen Kontonamen der Gegenstücke enthalten? –