Methoden Arraylist wird "überschrieben"

chuvak

Aktives Mitglied
Ich habe als Klassenvariable das definiert:
Java:
List spielerListe = new ArrayList();

In einer Funktion werden Mitspieler aus einer DB ausgelesen und in einer Schleife der Liste hinzugefügt. Wenn ich am Ende der Funktion (außerhalb der Schleife) abfrage, wieviele Elemente die Liste hat, erhalte ich entweder 1 oder 0, egal, wieviele Mitspieler aus der DB geholt wurden.
Ich habe das gefühl, dass die Schleife jedes Mal mit den neuen Einträgen überschrieben wird, sodass da nicht z.B. 3 Mitspieler sind, sondern nur 1.

Java:
// Ausschnitt aus der View, wo die Funktion in der DB aufgerufen wird:
String meldung = db.auslesen(anzahlSpieler, tfName[i].getText(), String.valueOf(tfPasswort[i].getPassword()));

// Ausschnitt aus der Klasse DB:

  public String auslesen(int anzahlSpieler, String user, String pass) {
    try {
      stmt = conn.createStatement();
      rs = stmt.executeQuery("SELECT * FROM SPIELER where username='" + user + "' AND password='" + pass + "'");

      meldung = " - Bitte überprüfen Sie Ihre Benutzerangaben.";
      while (rs.next()) {
        meldung = "";
        spielerListe.add(user);
        System.out.println("hinzugefügt");
      }

      rs.close();
      stmt.close();

    } catch (SQLException ex) {
      System.out.println("fehler beim auslesen");
    }

    System.out.println("anzahl " + this.spielerListe.size());
    return meldung;
  }

Die Ausgabe ist immer:
hinzugefügt
anzahl 1
hinzugefügt
anzahl 1


Weiß jemand, wo der Fehler liegt?
 
So wie der Code aussieht wird da wahrscheinlich wirklich nur ein spieler hinzugefügt daher ist nur einer in der List.

mehr kann ich nicht sagen, da ich weder den Inhalt der Datenbank kenne, aber auch nicht was du nach vor bzw. nach dem Aufruf dieser Methode machst
 
Java:
package spiel;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class DB {

  Connection conn = null;
  Statement stmt = null;
  ResultSet rs = null;
  String tabelle;
  String[] spalten = null;
  int i = 0;
  Spieler spieler;
  Object Klasse;
  String option;
  String meldung = "";
  String[] spielerNamen;
  static List spielerListe = new ArrayList();
  boolean fehler = true;

  public DB() {
    verbinden();
  }

  public void verbinden() {

    //Treiber laden

    try {
      Class.forName("com.mysql.jdbc.Driver").newInstance();
    } catch (Exception ex) {
      System.out.println("Fehler beim Treiber-Laden");
    }

// Verbindungsaufbau
    try {
      conn = DriverManager.getConnection("jdbc:mysql://localhost/spiel?user=root");
    } catch (SQLException ex) {
      System.out.println("SQLException: " + ex.getMessage());
      System.out.println("SQLState: " + ex.getSQLState());
      System.out.println("VendorError: " + ex.getErrorCode());
    }
  }

  public String dbRegistrieren(String user, String pass) {
    try {
      stmt = conn.createStatement();
      stmt.executeUpdate("INSERT INTO spieler (username, password) VALUES ('" + user + "', '" + pass + "')");
      stmt.close();
      meldung = "<html>Die Registrierung war erfolgreich!<br>Sie können Sie jetzt mir Ihren Benutzerdaten anmelden!</html>";

    } catch (SQLException ex) {
      System.out.println("fehler beim schreiben");
      meldung = "Etwas lief bei Ihrer Registrierung schief...";
    }
    return meldung;
  }

  public String auslesen(int anzahlSpieler, String user, String pass) {
    spielerNamen = new String[anzahlSpieler];
    try {
      stmt = conn.createStatement();
      rs = stmt.executeQuery("SELECT * FROM SPIELER where username='" + user + "' AND password='" + pass + "'");

      while (rs.next()) {
        fehler = false;
        spielerListe.add(user);
        System.out.println("hinzugefügt");
      }

      rs.close();
      stmt.close();

    } catch (SQLException ex) {
      System.out.println("fehler beim auslesen");
    }
    if (fehler == true) {
      meldung = " - Bitte überprüfen Sie Ihre Benutzerangaben.";
      spielerListe.clear();
    } else {
      if (spielerListe.size() == spielerNamen.length) {
        System.out.println("alles richtig!");
        meldung = "OK";
      }
    }
    System.out.println("anzahl " + spielerListe.size());
    return meldung;
  }

  public void beenden() {
    try {
      conn.close();
      conn = null;
    } catch (SQLException ex) {
      System.out.println("Fehler beim Schließen");
    }
  }
}
 
Grundsätzlich ist ja dein DB sowas wie ein DatenZugriffsObjekt (DAO), ich würde da drinnen überhaupt keine List spielerListe machen.
Irgendetwas ließt eine Spieler ein um diese an zu zeigen usw da würde ich die liste hingeben.
Aber generell sollte es funktionieren auch wenn die Liste nicht static ist. Weißt du was static bedeuet? Wird irgendwo immer wieder new DB() aufgerufen?

Ich verstehe auch nicht genau was die auslesen Methode machen soll. Beschreib mal was genau diese Methode macht. Die ließt einen Spieler mit Namen, merkt sich die in einer Liste und wenn einer nicht gefunden wurde leert sie die liste ??? Da geschiet zu viel...Ich würde einfach zwei Methoden machen, eine ließt eine Liste von Spielern und eine ließt einen bestimmten...
bzw wie hängt eigentlich so ein Spieler mit dem usernamen zusammen?
 
führe doch dein query mal z.b. in phpMyAdmin aus ...
weil so wie ich das sehe fragst du nämlich nur nach einem bestimmten spieler ... und dann ist klar das dir die db nur diesen einen zurückgibt oder eben nichts wenn dieser nicht in der datenbank gefunden wird
siehe hierzu mal dein query : "SELECT * FROM `spieler` WHERE `username` = '"+user+"' AND `password` = '"+pass+"'"
du willst also alle zeilen die folgende bedingungen erfüllen
-alle spalten : SELECT *
-aus der tabelle spieler : FROM `spieler`
-wenn "username" und "password" den übergebenen argumenten entsprechen : WHERE `username` = '"+user+"' AND `password` = '"+pass+"'"
das du dann entweder 0 oder 1 erhälts liegt daran das entweder der user gefunden wird oder eben nicht ...

jetzt wäre die frage : was genau du haben willst ... daraus könnte man dann *mit der struktur deiner tabelle* n query zusammen bauen ... aber so wie dein query atm aufgebaut ist wirst du sicher nicht auf deine lösung kommen die du haben willst
 
Hi,
alleine diese Zeile ist schon komisch:
Java:
spielerListe.add(user);
hier wird überhaupt nichts aus der db ausgelesen sondern einfach der String der als parameter an die Funktion übergeben wird, wieder und wieder in die Liste eingefügt.
Außerdem bietet es sich an Streams (bin nicht fit in den db-angelegenheiten, aber das sind doch Streams oder?) in einem finally-block zu schließen.
Eine Zusammenfassung was die Methoden machen sollen wäre vielleicht hilfreich 😉
Gruß
 

Zurück
Oben