Problem mit der ausgabe/listanzeige von datenbankelementen

  • Hallo,


    ich arbeite mich gerade in sqlite ein. Habe eine DB erstellt mit einer Tabelle die folgende spalten beinhaltet: ID,Name, Betrag, Grund, Datum, Icon.


    Die einträge sollen an einer custom listview angezeigt werden, was ich auch hinbekommen habe. Das problem ist, wenn es beispielsweise einträge gibt mit gleichen namen, sollen dann diese in der listview nur einmal angezeigt werden.


    Beispiel: in der Db ist folgende namen einträge
    Ali
    Richard
    Tom
    John
    Elli
    Tom
    Ali
    Ali


    Mit der Methode


    bekomme ich so wie im beispiel aufgelistet alle namen gelistet. Was ich aber will ist, dass gleich vorkommende namen nur einmal angezeigt werden, also Ali, Richard,Tom,John,Elli.


    Damit ALLE zeilen ausgegeben werden erfolgt mit dieser Methode:


    ich habe die methode etliche male umgeschrieben, momentan sieht die so aus:



    wenn ich das so lasse wie jetzt bekomme ich eine
    java.lang.IllegalArgumentException: the mBindArgs is null. Irgendwas mache ich bei der sql-anweisung falsch, komme aber nicht drauf :-/

  • Spontan fallen mal folgende Punkte auf:


    - wenn du den Cursor mit einem Adapter nutzen willst, dann muss deine Rowlist eine Spalte Namens "_id" enthalten
    - hab ich jetzt nicht probiert, aber "select name, sum(betrag) as betrag..." ist schon ein sportlicher Ansatz ;)
    - die abgefragten Spalten deines Cursors müssen mit den Einträgen in "dbSpaltenNamen" übereinstimmen


    Zu der Fehlermeldung hast du bestimmt auch eine Zeilennummer - was steht denn in der Zeile?
    Mit dem SQL-Statement hat das jedenfalls wenn dann nur indirekt zu tun.



    Zum Lösungsansatz (davon ausgehend das deine SQL-Abfrage deinen Anzeigewunsch widerspiegelt):


    1. Die ID wirst du für die Liste ja selber nicht benötigen (schon weil es eben mehr als eine pro Eintrag geben kann);
    der Adapter will aber eine, noch dazu mit einem Namen den es in deiner Tabelle nicht gibt.
    -> select 1 as _id, name as n, sum(betrag) as b from tabelle group b 1,2 order by 2
    Sollte das gewünschte Ergebnis in geeigneter Form liefern.


    2. Deine Zuordnungs-Arrays müssen dann halt entsprechend angepasst werden:
    dbSpaltenNamen = new String[] {"n", "b"};
    zuListViewIDs = new int[] {R.id.txt_name, R.id.txt_summe};
    ...Das entsprechende Layout muss natürlich ebenfalls dazu passend gestaltet werden.

  • hat wunderbar geklappt. danke dir ;)


    eine frage nebenbei: gibt es eine möglichkeit, die strings die in der db abgelegt sind ohne die leerzeilen bzw. ohne groß/klein Buchstaben zu prüfen? weil wenn ich jetzt zwei einträge mit den selben namen habe Beispiel: "Olaf" und "Olaf " dann werden zwei einträge gemacht, oder wenn man das eine "O" klein schreibt etc. kann man das mit einer sql anweisung machen? Mit java wüsste ich schon wie, aber nicht direkt mit sql.

  • Zitat

    hat wunderbar geklappt. danke dir

    Gerne - ist für sowas in diesem Forum nicht eigentlich die Bedanken-Funktion gedacht?


    Zitat

    strings die in der db abgelegt sind ohne die leerzeilen bzw. ohne groß/klein Buchstaben zu prüfen?

    ...where upper(trim(name))='OLAF'


    sollte das gewünschte leisten.
    eine gute Quelle für solche Fragen ist übrigens sqlite.org ;)

  • Wobei 'trim()' meines Wissens nach zwar bei 'Olaf', 'Olaf ', ' Olaf ' und ' Olaf' funktioniert, aber nicht bei 'Hans-Peter' und 'Hans - Peter'. Und schon gar nicht bei 'Hans Peter' und 'Hans-Peter'.


    Es ist in den meisten Fällen eine schlechte Idee, sich auf die korrekte Eingabe von Strings zu verlassen.
    Wenn Du also beispielsweise eine personenbezogene Bestenliste führen möchtest, solltest Du davon absehen, alles in eine Tabelle pappen zu wollen und ein wenig normalisieren.


    Also statt

    C
    id| name  | punkte
    --+-------+-------
    1 | Torben | 123
    2 | Torben | 98
    3 | Jan    | 92
    4 | Torben | 110
    5 | Sven   | 189
    6 | Mike   | 93
    7 | Mike   | 99


    Lieber zwei Tabellen:

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!