SQLite Werte aus zwei Tabellen zusammenführen

Ataria

Mitglied
Hallo zusammen,

ich bin neu bei der Programmierung mit Java und stecke seit Tagen an einem Problem fest, das ich einfach nicht gelöst bekomme... ich hoffe, ihr könnt mir hier helfen 🙂
Zunächst erst einmal der Code:

Java:
else if (ereignis.getMessage().getContentRaw().startsWith(".ha")) {

    String name = ereignis.getAuthor().getName();

    helden = ereignis.getMessage().getContentRaw().toLowerCase().substring(4);

    String helden2 = ereignis.getMessage().getContentRaw().toLowerCase().substring(5);

    String[] splitstrength = helden2.trim().split("\\s*[^0-9]+\\s*");

    String[] splithelden = helden.trim().split("\\s*[0-9]+\\s*");

    Datenbank.onUpdate("CREATE TABLE IF NOT EXISTS held" + name + "(id INTEGER NOT NULL, memberid INTEGER, hero VARCHAR, strength INTEGER)");

    Datenbank.onUpdate("CREATE TABLE IF NOT EXISTS stärke" + name + "(id INTEGER NOT NULL, strength)");


    for (int i = 0; i < splithelden.length; i++) {

        System.out.println(splithelden[i]);

        Datenbank.onUpdate("INSERT INTO held" + name + "(id, memberid, hero, strength) VALUES(" + i + ", " + user + ", '" + splithelden[i] + "', '0')");


    }

    for (int i = 1; i < splitstrength.length; i++){

        System.out.println(splitstrength[i]);

        Datenbank.onUpdate("INSERT INTO held" + name + "(id, memberid, hero, strength) VALUES(" + i + ", " + user + ", 'nichts', '" + splitstrength[i] + "')");

    }

    try {

        ResultSet ergebnis = Datenbank.onQuery("SELECT strength FROM stärke" + name +"");

        String ergStr = "";

        while (ergebnis.next()) {

            ergStr = ergStr.concat("\n" + ergebnis.getString("strength") + "\n");


        }

        System.out.println(ergStr);

        String[] erg = ergStr.trim().split("\\s*[^0-9]+\\s*");

        for (int i = 0; i < erg.length; i++){

            System.out.println(erg[i]);

            String update = "UPDATE held" + name + " SET strength= '" + erg[i] + "'";

            File file = new File("datenbank.db");

            String url = "jdbc:sqlite:" + file.getPath();

            Connection conn = null;

            Statement stmt = null;

            conn = DriverManager.getConnection(url);

            stmt = conn.createStatement();

            stmt.executeUpdate(update);}


    } catch (SQLException e) {

        e.printStackTrace();; }

Ich arbeite quasi an einem Discord Bot, der für ein Spiel über ein paar Befehle Daten der einzelnen Mitglieder sammeln und entsprechend in der Datenbank speichern soll. Ich bin nun so weit, dass er zwar den eingegeben Text versteht und das auch alles schön einzeln in die Tabellen einträgt, aber wenn ich nun die "strength" aus der Tabelle "stärke" in die Spalte "strength" aus der Tabelle "helden" überspielen will, dann macht er bei diesem Code folgendes: Er spielt nur die letzte der eingegeben Stärken zurück. Beispiel: A 123 B 456 C 789 - er trägt jetzt A B C in die Zeilen der Tabelle 1 ein, 123 456 789 in die Zeilen der Tabelle 2. Schön und gut. Aber nun nimmt er bei meinem Code bei der Zusammenführung nur 789 und trägt das in jede Zeile der Tabelle 1 in die Spalte ein... Also die richtige Spalte erwischt er, aber gibt eben immer nur den letzten Wert wiederholt dort aus... Könnt ihr mir hier helfen, wie wirklich Wert 1 in Zeile 1, Wert 2 in Zeile 2 usw. übertragen wird? Das wäre klasse 🙂 Bin echt am verzweifeln...
 
Ich werfe mal den Begriff "prepared statement" in den raum

das ist die Sichere Art SQL statements in Programmen auszuführen, das wird jetzt hier nicht unbedingt benötigt aber es wäre ein Thema was man sich mal anschauen könnte

bei echten datenbank ist das eine Grund vorraussetzung um Fehler zu vermeiden
 
Man sieht das du Anfänger bist, trotzdem muss ich kritisch bemerken, das der Quellcode wirklich gruselig ist. "prepared statement" sind das kleinste Problem. Ich behaupte das Programm funktioniert so nicht. Wenn du zum 1. mal da lang kommst, liefert
"SELECT strength FROM stärke" + name +"")
keine Werte, weil hier kein Insert für die Tabelle existiert. Noch schlimmer wir es, wenn du zum 2. mal da lang kommst - es werden bedenkenlos Inserts ausgeführt, ohne mal zu schauen ob es bereits ein Datensatz mit der ID existiert. Eine ID sollte, schon laut Name, eindeutig/einmalig sein, nicht einfach ein Zähler, der immer wieder benutzt wird.
Richtig krass wird es in der letzten Schleife, bei jedem Durchgang wird die Datenbank neu geöffnet aber nie geschlossen.
Du solltest den Ablauf für dich erst mal irgendwo mit Stift und Papier skizzieren und dann eine vernünftige nachvollziehbare Programmstruktur mit kleinen überschaubaren Methoden entwickeln und später erst den Programmcode hinzufügen.
Wie ich das sehe ist auch nicht für jeden Namen eine eigene DB-Tabelle notwendig, Name kann eine Spalte sein, auf welche die Abfragen eingeschränkt werden. Dann ist es auch nicht notwendig die SQL-Befehle als String zusammenzusetzen - Diese Vorgehen ist eine grobe Sicherheitslücke und etwas, was man niemals tun sollte.
 

das programm kann sich sqlite datenbanken anschauen und daten einfügen

das ist ansich ein SQL database manager mehr oder weniger, das sollte/könnte dir helfne um den aktuellen stand anzuschauen und zu sehen was da im moment drin steht
so als hilfe tool
 
Man sieht das du Anfänger bist, trotzdem muss ich kritisch bemerken, das der Quellcode wirklich gruselig ist. "prepared statement" sind das kleinste Problem. Ich behaupte das Programm funktioniert so nicht. Wenn du zum 1. mal da lang kommst, liefert
"SELECT strength FROM stärke" + name +"")
keine Werte, weil hier kein Insert für die Tabelle existiert. Noch schlimmer wir es, wenn du zum 2. mal da lang kommst - es werden bedenkenlos Inserts ausgeführt, ohne mal zu schauen ob es bereits ein Datensatz mit der ID existiert. Eine ID sollte, schon laut Name, eindeutig/einmalig sein, nicht einfach ein Zähler, der immer wieder benutzt wird.
Richtig krass wird es in der letzten Schleife, bei jedem Durchgang wird die Datenbank neu geöffnet aber nie geschlossen.
Du solltest den Ablauf für dich erst mal irgendwo mit Stift und Papier skizzieren und dann eine vernünftige nachvollziehbare Programmstruktur mit kleinen überschaubaren Methoden entwickeln und später erst den Programmcode hinzufügen.
Wie ich das sehe ist auch nicht für jeden Namen eine eigene DB-Tabelle notwendig, Name kann eine Spalte sein, auf welche die Abfragen eingeschränkt werden. Dann ist es auch nicht notwendig die SQL-Befehle als String zusammenzusetzen - Diese Vorgehen ist eine grobe Sicherheitslücke und etwas, was man niemals tun sollte.
Hi, danke für die Antwort 🙂 Das Programm funktioniert, wie gesagt, schon und es gibt eine INSERT Funktion für die Tabelle. Also Werte hat er und er fügt diese auch ein (es ist ja nur ein Ausschnitt des Codes, davor kommen noch andere Dinge, nur hier hängt es eben bei diesem Command). Nur beim Zusammenführen beider Tabellen haut es wie gesagt nicht hin, weil er dann immer nur den letzten Wert der Tabelle nimmt und ihn in jede Zeile der anderen Tabelle einfügt anstatt jede einzelne Zeile in die andere Tabelle zu setzen... Da liegt eigentlich mein einziges Problem im Moment.
 

das programm kann sich sqlite datenbanken anschauen und daten einfügen

das ist ansich ein SQL database manager mehr oder weniger, das sollte/könnte dir helfne um den aktuellen stand anzuschauen und zu sehen was da im moment drin steht
so als hilfe tool
Danke, das verwende ich auch, um nachzuschauen 🙂 Daher weiß ich, dass er immer den jeweils letzten Wert der Tabelle nimmt und ihn in die andere Tabelle einfügt, statt jeden Wert in die richtige Zeile zu schreiben... Wenn in der einen Tabelle jetzt stehen würde:
1. Zeile: A
2. Zeile: B
3. Zeile: C

und in der zweiten Tabelle:
1. Zeile: 1
2. Zeile: 2
3. Zeile: 3

schreibt er dann leider nicht in die erste Tabelle jeweils:
A 1
B 2
C 3

sondern er schreibt in die Spalte daneben einfach immer nur die 3, also
A 3
B 3
C 3

und ich weiß einfach nicht warum...
 

Zurück
Oben