Derby/JavaDB Unfindbarer Fehler im Datenbank-Code

DaCrazyJavaExpert

Bekanntes Mitglied
Hallo,
dies ist schon mein dritter Thread zum Thema Dantenbanken. Allerdings hab ich in den vorherigen Threads bisher die Fehler gefunden, oder eine andere Methode probiert. Nun ja, nun hab ich aber das Problem, dass die Daten, wie es scheint, nicht gespeichert werden, da beim Programmstart die Daten wieder auf null sind. Ich finde den Fehler einfach nicht, trotz dessen, dass ich die Datenbank praktisch von meinem Buch "abgeschrieben" habe. Ich hoffe mir kann jemand weiterhelfen. Wenn ich für dieses Problem die Lösung finde, lass ich euch fürs erste mit Datenbanken in Ruhe :). Aber wenn ich die Lösung nicht finde, lässt es mir keine Ruhe.
Also hier ist der Code/die Datenbank Klasse:
Java:
public class Database {
  
    private static CookieClickerGUI guiVarObject = new CookieClickerGUI();
  
    private final static String CREATE_DATA_TABLE = "CREATE TABLE COOKIE_VALUES ("
            + "ID INT NOT NULL GENERATED BY DEFAULT AS IDENTITY, " + "COOKIES_PRO_KLICK INT, " + "ANZAL_COOKIES BIG INT, "
            + "PRIMARY KEY (ID) " + ")"; //Tabelle erzeugen
    private final static String ADD_INSTRUCTIONS = "INSERT INTO COOKIE_VALUES VALUES (DEFAULT, ?, ?)"; //Datensätzte setzen

    private static String id;
    private static int cookies_Pro_Klick;
    private static long anzahl_Cookies;

    public static int getCookies_Pro_Klick() {
        return cookies_Pro_Klick;
    }

    public static void setCookies_Pro_Klick(int cookies_Pro_Klick) {
        Database.cookies_Pro_Klick = cookies_Pro_Klick;
    }

    public static long getAnzahl_Cookies() {
        return anzahl_Cookies;
    }

    public static void setAnzahl_Cookies(int anzahl_Cookies) {
        Database.anzahl_Cookies = anzahl_Cookies;
    }

    private static Connection createConnection() throws ClassNotFoundException, SQLException {
        Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
        Connection connection = DriverManager.getConnection("jdbc:derby:database/cookie;create=true");
        return connection;
    }

    public static void registerConnectionInMain() { //bei Programmstart werden alle Daten in die GUI eingetragen
        try (Connection connection = createConnection()) {
            DatabaseMetaData metaData = connection.getMetaData();
            ResultSet tables = metaData.getTables(null, "APP", "COOKIE_VALUES", null);
            if (!tables.next()) { //Nur erstellen wenn Datenbank noch nicht vorhanden ist
                Statement instructions = connection.createStatement();
                instructions.executeUpdate(CREATE_DATA_TABLE);
                instructions.close();
            }
          
            PreparedStatement queryInstructions = connection.prepareStatement("SELECT * FROM COOKIE_VALUES"); //Von der Datenbank COOKIE_VALUES Daten holen
            ResultSet resultSet = queryInstructions.executeQuery();
            while (resultSet.next()) {
                id = resultSet.getString("ID");
                cookies_Pro_Klick = resultSet.getInt("COOKIES_PRO_KLICK"); //Daten holen
                anzahl_Cookies = resultSet.getLong("ANZAL_COOKIES"); //Daten holen
                guiVarObject.setCookiesProClick(cookies_Pro_Klick); //Daten in GUI schreiben
                guiVarObject.setAnzahlCookies(anzahl_Cookies); //Daten in GUI schreiben
            }
        } catch (ClassNotFoundException e) {
            System.err.println("Database driver not found!");
        } catch (SQLException e) {
            System.err.println("SQL error");
            e.printStackTrace();
        }
    }

    public static void registerConnectionInListener() { //Daten werden in der Datenbank bei jedem klick auf den Cookie aktualisiert/mit den neuen Daten überschrieben
        try (Connection connection = createConnection()) {
            PreparedStatement insertStatement = connection.prepareStatement(ADD_INSTRUCTIONS);
            insertStatement.setInt(1, guiVarObject.getCookiesProClick()); //aus Programm (GUI) holen, in Datenbank setzten
            insertStatement.setLong(2, guiVarObject.getAnzahlCookies()); //aus Programm (GUI) holen, in Datenbank setzten
            insertStatement.executeUpdate();
        } catch (ClassNotFoundException e) {
            System.err.println("Database driver not found!");
        } catch (SQLException e) {
            System.err.println("SQL error");
            e.printStackTrace();
        }
    }

    public static String getId() {
        return id;
    }

    public static void setId(String id) {
        Database.id = id;
    }
}
Ich persönlich glaube, dass der Fehler in der Methode "registerConnectionInMain" liegt, da da die Datenbank erstellt und "initialisiert" liegt, aber ich kann mich auch täuschen.

Ich bin froh über jegliche Art von Hilfe. Danke!
 

JStein52

Top Contributor
Irgendwelche Exceptions ? Bau doch mal in die resulSet-Schleife ein sysout ein und guck was passiert ? Oder gleich den Debugger benutzen.
 

DaCrazyJavaExpert

Bekanntes Mitglied
Exceptions gibts keine. Ich habs jetzt mit einem sysout probiert und den Debugger benutzt, und wie es scheint, wird die while-Schleife viel zu oft durchlaufen. Wieso, dass seh ich jetzt nicht, ich seh nur wie Tausende sysouts in der Konsole erscheinen.
 

JStein52

Top Contributor
Er meint damit dass deine ADDS_INSTRUCTION jedesmal ein insert in der Datenbank durchführt. Vielleicht wolltest du aber nur ein update machen ? Wobei die Auswirkung dieses Fehlers eigentlich sein sollte dass du immer den letzten Datensatz siehst. Denn beim Seelect überschreibst du deine Werte ja mit jedem gelesenen Datensatz aus der DB. Es erklärt aber warum du diese vielen Ausgaben per sysout hast
 

DaCrazyJavaExpert

Bekanntes Mitglied
Ich dachte ich überschreibe mit
Java:
insertStatement.setInt(1, guiVarObject.getCookiesProClick());
//+
            insertStatement.setLong(2, guiVarObject.getAnzahlCookies());
Die Daten in der Datenbank, also mache sogesehen ein Update. Wie update ich die Werte denn dann? In meinem Buch steht es genau so, wie ichs jetzt in meinem Code habe, bis auf die Variablen, aber vom Prinzip her steht es in meinem Buch genauso. Und es hat mal funktioniert gehabt, mit dem Daten "updaten", aber irgendwie geht es jetzt nicht mehr, entweder ich habe ausversehen Code entfernt/verändert, oder Eclipse hat einen Fehler, was ich satrk bezweifle.
 

JStein52

Top Contributor
Ich vermute dass es noch nie funktioniert hat aber du hast halt immer den letzten Satz aus der Datenbank gesehen und gedacht alles ist ok. Und im übrigen schau dir mal die Syntax des UPDATE-Statements an .... Ist das in deinem Buch nicht beschrieben ?
 

DaCrazyJavaExpert

Bekanntes Mitglied
Ich weiß nicht, ich hab grad nochmal nachgeschaut, und da steht auch, dass excecuteUpdate() zum verändern von Daten genommen werden muss.. Und das hier hab ich über die UPDATE-Statement Syntax gefunden, bestätigt also einerseits das aus dem Buch:
An UPDATE statement is used to modify a subset of the values
. Leider hab ich nur Websiten auf Englisch gefunden, Deutsch wäre vielleicht günstiger für mich.
 

DaCrazyJavaExpert

Bekanntes Mitglied
So, danke für die ganzen hilfreichen Links, es sieht auf jeden Fall schonmal besser aus als zurvor (im Code). Nun hab ich aber noch ein Fehler, sogar mit Exception:
SQL error
java.sql.SQLSyntaxErrorException: Syntaxfehler: Encountered "INT" at line 1, column 121.
at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source)
at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedStatement.execute(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedStatement.executeLargeUpdate(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedStatement.executeUpdate(Unknown Source)
at de.m_ver.cookieclicker.database.Database.registerConnectionInMain(Database.java:55)
at de.m_ver.cookieclicker.main.Main$1.run(Main.java:14)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: ERROR 42X01: Syntaxfehler: Encountered "INT" at line 1, column 121.
at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
at org.apache.derby.impl.sql.compile.ParserImpl.parseStatementOrSearchCondition(Unknown Source)
at org.apache.derby.impl.sql.compile.ParserImpl.parseStatement(Unknown Source)
at org.apache.derby.impl.sql.GenericStatement.prepMinion(Unknown Source)
at org.apache.derby.impl.sql.GenericStatement.prepare(Unknown Source)
at org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(Unknown Source)
... 19 more
Ich habe das ganz auch schon debugt, und bei der Zeile, in der Die Datenbank erstellt wird
Java:
instructions.executeUpdate(CREATE_DATA_TABLE);
Springt der Debugger direkt zum
Java:
} catch (SQLException e) {
            System.err.println("SQL error");
            e.printStackTrace();
        }
Also liegt irgendwo da der Fehler. In der Exception steht ja auch:
at de.m_ver.cookieclicker.database.Database.registerConnectionInMain(Database.java:55)
, was auf die Zeile der Datenbank-Erstellung verweist. Den Fehler seh ich trotzdem nicht. Was das hier bedeutet, weiß ich auch nicht:
java.sql.SQLSyntaxErrorException: Syntaxfehler: Encountered "INT" at line 1, column 121.
. Begegnet "INT" in Zeile 1, Säule 121?
Und hier nochmal der ganze Code:
Java:
public class Database {
   
    private static CookieClickerGUI guiVarObject = new CookieClickerGUI();
   
    private final static String CREATE_DATA_TABLE = "CREATE TABLE COOKIE_VALUES ("
            + "ID INT NOT NULL GENERATED BY DEFAULT AS IDENTITY, " + "COOKIES_PRO_KLICK INT, " + "ANZAHL_COOKIES BIG INT, "
            + "PRIMARY KEY (ID) " + ")"; //Tabelle erzeugen
    private final static String ADD_INSTRUCTIONS = "INSERT INTO COOKIE_VALUES VALUES (DEFAULT, ?, ?)"; //Datensätzte setzen
    private final static String UPDATE_VALUES = "UPDATE COOKIE_VALUES SET COOKIES_PRO_KLICK= ?, ANZAHL_COOKIES= ?";

    private static String id;
    private static int cookies_Pro_Klick;
    private static long anzahl_Cookies;

    public static int getCookies_Pro_Klick() {
        return cookies_Pro_Klick;
    }

    public static void setCookies_Pro_Klick(int cookies_Pro_Klick) {
        Database.cookies_Pro_Klick = cookies_Pro_Klick;
    }

    public static long getAnzahl_Cookies() {
        return anzahl_Cookies;
    }

    public static void setAnzahl_Cookies(int anzahl_Cookies) {
        Database.anzahl_Cookies = anzahl_Cookies;
    }

    private static Connection createConnection() throws ClassNotFoundException, SQLException {
        Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
        Connection connection = DriverManager.getConnection("jdbc:derby:database/cookie;create=true");
        return connection;
    }

    public static void registerConnectionInMain() { //bei Programmstart werden alle Daten in die GUI eingetragen
        try (Connection connection = createConnection()) {
            DatabaseMetaData metaData = connection.getMetaData();
            ResultSet tables = metaData.getTables(null, "APP", "COOKIE_VALUES", null);
            if (!tables.next()) { //Nur erstellen wenn Datenbank noch nicht vorhanden ist
                Statement instructions = connection.createStatement();
                instructions.executeUpdate(CREATE_DATA_TABLE);
                PreparedStatement insertStatement = connection.prepareStatement(ADD_INSTRUCTIONS);
                insertStatement.setInt(1, 1); //aus Programm (GUI) holen, in Datenbank setzten
                insertStatement.setLong(2, guiVarObject.getAnzahlCookies()); //aus Programm (GUI) holen, in Datenbank setzten
                insertStatement.executeUpdate();
                instructions.close();
            }
           
            PreparedStatement queryInstructions = connection.prepareStatement("SELECT * FROM COOKIE_VALUES"); //Von der Datenbank COOKIE_VALUES Daten holen
            ResultSet resultSet = queryInstructions.executeQuery();
            while (resultSet.next()) {
                System.out.println("Funktioniert");
                id = resultSet.getString("ID");
                System.out.println("Id bekommen");
                cookies_Pro_Klick = resultSet.getInt("COOKIES_PRO_KLICK"); //Daten holen
                System.out.println("Cpk bekommen");
                anzahl_Cookies = resultSet.getLong("ANZAHL_COOKIES"); //Daten holen
                System.out.println("ac bekommen");
                guiVarObject.setCookiesProClick(cookies_Pro_Klick); //Daten in GUI schreiben
                System.out.println("cpk setzten");
                guiVarObject.setAnzahlCookies(anzahl_Cookies); //Daten in GUI schreiben
                System.out.println("ac setzen");
            }
        } catch (ClassNotFoundException e) {
            System.err.println("Database driver not found!");
        } catch (SQLException e) {
            System.err.println("SQL error");
            e.printStackTrace();
        }
    }

    public static void registerConnectionInListener() { //Daten werden in der Datenbank bei jedem klick auf den Cookie aktualisiert/mit den neuen Daten überschrieben
        try (Connection connection = createConnection()) {
            PreparedStatement updateValues = connection.prepareStatement(UPDATE_VALUES);
            updateValues.setInt(1, guiVarObject.getCookiesProClick());
            updateValues.setLong(2, guiVarObject.getAnzahlCookies());
            updateValues.executeUpdate();
        } catch (ClassNotFoundException e) {
            System.err.println("Database driver not found!");
        } catch (SQLException e) {
            System.err.println("SQL error");
            e.printStackTrace();
        }
    }

    public static String getId() {
        return id;
    }

    public static void setId(String id) {
        Database.id = id;
    }
}
Danke!
 

DaCrazyJavaExpert

Bekanntes Mitglied
Edit: Und dieses Statement geht doch auch schief wenn die Tabelle in der DB schon existiert. Du solltest also schreiben:
"CREATE TABLE IF NOT EXISTS .....
Ich hab ja schon dies hier:
Java:
if (!tables.next())
Das Prüft doch, ob die Datenbank schon da ist oder nicht. Aber doppelt hält besser :).
Danke.

#EDIT: nun kommt diese Exception:
java.sql.SQLSyntaxErrorException: Syntaxfehler: Encountered "NOT" at line 1, column 17.
Dafür ist die andere weg.
 

DaCrazyJavaExpert

Bekanntes Mitglied
Und wenn ich dieses
CREATE TABLE IF NOT EXISTS
entferne ist der alte Fehler wieder da.
Java:
private final static String CREATE_DATA_TABLE = "CREATE TABLE COOKIE_VALUES ("
            + "ID INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY, " + "COOKIES_PRO_KLICK INT, " + "ANZAHL_COOKIES BIG INT, "
            + "PRIMARY KEY (ID) " + ")"; //Tabelle erzeugen
java.sql.SQLSyntaxErrorException: Syntaxfehler: Encountered "INT" at line 1, column 125.
 

JStein52

Top Contributor
Vielleicht liegt es aber auch nur daran dass du BIG INT geschrieben hast und nicht BIGINT ?
Ich kenne nur MySQL und da wäre es wurscht ob INT oder INTEGER, aber BIG INT wäre falsch
 

DaCrazyJavaExpert

Bekanntes Mitglied
Ja dieses INT kommt weiter hinten in dem Statement nochmal vor. Mach da auch INTEGER draus
Ah stimmt. Jetzt hab ichs geändert, allerdings kommt der Fehler wieder, nur mit nem anderen column:
java.sql.SQLSyntaxErrorException: Syntaxfehler: Encountered "INT" at line 1, column 129.
Java:
private final static String CREATE_DATA_TABLE = "CREATE TABLE COOKIE_VALUES ("
            + "ID INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY, " + "COOKIES_PRO_KLICK INTEGER, " + "ANZAHL_COOKIES BIG INT, "
            + "PRIMARY KEY (ID) " + ")"; //Tabelle erzeugen
Hier drin kommt nur noch BIG INT vor, was für Long steht, das kann also eigentlich nicht gemeint sein, oder?
Danke
 

DaCrazyJavaExpert

Bekanntes Mitglied
Vielleicht liegt es aber auch nur daran dass du BIG INT geschrieben hast und nicht BIGINT ?
In meinem Buch steht BIG INT getrennt. Aber probieren schadet nichts... und ... es wird tatsächlich kein Fehler mehr angezeigt. (Mein Buch hats echt nicht so mit der Richtigkeit seiner Einträge). Ok Danke.
Allerding werden nun die Daten nicht richtig abgerufen, bei Programmstart. Die anzahlCookies bleiben bei 0, wenn ich das Programm neu starte, obwohl bei jedem Klick auf den (in meinem Fall) Cookie 1 zu anzahlCookies addiert wird. Und eigentlich auch in der Datenbank aktualisiert wird:
Java:
private final static String UPDATE_VALUES = "UPDATE COOKIE_VALUES SET COOKIES_PRO_KLICK= ?, ANZAHL_COOKIES= ?";

    public static void registerConnectionInListener() { //Daten werden in der Datenbank bei jedem klick auf den Cookie aktualisiert/mit den neuen Daten überschrieben
        try (Connection connection = createConnection()) {
            PreparedStatement updateValues = connection.prepareStatement(UPDATE_VALUES);
            updateValues.setInt(1, guiVarObject.getCookiesProClick());
            updateValues.setLong(2, guiVarObject.getAnzahlCookies());
            updateValues.executeUpdate();
        } catch (ClassNotFoundException e) {
            System.err.println("Database driver not found!");
        } catch (SQLException e) {
            System.err.println("SQL error");
            e.printStackTrace();
        }
    }
 

DaCrazyJavaExpert

Bekanntes Mitglied
In meinem Buch steht BIG INT getrennt. Aber probieren schadet nichts... und ... es wird tatsächlich kein Fehler mehr angezeigt. (Mein Buch hats echt nicht so mit der Richtigkeit seiner Einträge). Ok Danke.
Allerding werden nun die Daten nicht richtig abgerufen, bei Programmstart. Die anzahlCookies bleiben bei 0, wenn ich das Programm neu starte, obwohl bei jedem Klick auf den (in meinem Fall) Cookie 1 zu anzahlCookies addiert wird. Und eigentlich auch in der Datenbank aktualisiert wird:
Java:
private final static String UPDATE_VALUES = "UPDATE COOKIE_VALUES SET COOKIES_PRO_KLICK= ?, ANZAHL_COOKIES= ?";

    public static void registerConnectionInListener() { //Daten werden in der Datenbank bei jedem klick auf den Cookie aktualisiert/mit den neuen Daten überschrieben
        try (Connection connection = createConnection()) {
            PreparedStatement updateValues = connection.prepareStatement(UPDATE_VALUES);
            updateValues.setInt(1, guiVarObject.getCookiesProClick());
            updateValues.setLong(2, guiVarObject.getAnzahlCookies());
            updateValues.executeUpdate();
        } catch (ClassNotFoundException e) {
            System.err.println("Database driver not found!");
        } catch (SQLException e) {
            System.err.println("SQL error");
            e.printStackTrace();
        }
    }
EDIT: Also selected werden die Daten jedenfalls, da Die sysouts auch ausgegeben werden. Also das Problem liegt definitiv irgendwo im Update Teil und nicht daran, dass die Daten nicht in der Datenbank sind.
 

DaCrazyJavaExpert

Bekanntes Mitglied
Du meinst diese Zeile oder ? Hast du mal nachgeschaut ob da wirklich der richtige Wert kommt ? (getAnzahlCookies() )
Wie meinst du das? "Ob der richtige Wert kommt?" Also ich bekomme damit den Wert der Variable anzahlCookies, aus der Klasse CookieClickerGUI. getAzhalCookies() ist der dazugehörige getter.
Java:
@Override
            public void mousePressed(MouseEvent e) {
                anzahlCookies += cookiesProClick; //Die Anzahl der Cookies um cookiesProClick erhöhen. Wobei der Defaultwert 0 ist und eigentlich 1 sein sollte.
                lblAnzahlCookies.setText("Cookies: " + anzahlCookies); //"Zahl"/Text vom cookieAnzahl label aktualisieren.
                lblCookie.setVisible(false);
                lblCookieClicked.setVisible(true);
                Database.registerConnectionInListener(); //Wenn Cookie geklickt wird, Daten in Datenbank aktualisieren/überschreiben.
            }
Also, wie gesagt bei einem Klick, wird anzahlCookies + cookiesProClick gerechnet, wobei cookiesProClick 1 entspricht. Und dann wird der neue Wert in der Methode registerConnectionInListener() (Updat_Methode)verwendet. Oder so soll es jedenfalls sein.
 

mrBrown

Super-Moderator
Mitarbeiter
Ich möchte nur noch mal anmerken, dass ich schon vor längerem auf diesen unglaublich komplexen Code für diese ziemlich simple Aktion hingewiesen habe ;)
 

DaCrazyJavaExpert

Bekanntes Mitglied
Oh stimmt, wenn ich da jetzt ein Sysout hinzufüge, wird immer 0 ausgegeben, bei einem Klick auf den Cookie, trotz, dass ich anzhalCookies immer mit 1 addiere. Komisch
Das verstehe ich nicht, beim Sysout in der Database Klasse, bleibt anzahlCookies immer bei 0. Beim Code in der GUI Klasse, wirds aber addiert, da sonst ja nicht die Anzeige bei jedem Klick um 1 steigen würde. Also irgendwie kommt wohl der Wert von anzahlCookies nicht in die Database Klasse/ in die Methode aus der Klasse.
 

JStein52

Top Contributor
unglaublich komplexen Code für diese ziemlich simple Aktion
Inzwischen sind wir doch schon ein gutes Stück weiter und es wird immerhin schon ein update in der DB gemacht. Und es sollte doch jetzt auch noch möglich sein rauszufinden warum der select da immer eine 0 liefert wo er eine 1 erwartet. Und ab dann kann er ja umbauen.
 

DaCrazyJavaExpert

Bekanntes Mitglied
Siehst du, jetzt brauchst du beim Datenbankhandling vorerst gar nicht weiter zu gucken. Der Fehler ist an einer anderen Stelle
Ja, jetzt muss ich nur schauen wo. Kann es sein, dass der Wert nicht in andere Klassen "kommen" kann, weil der Wert nur in der Variable, die in der mousePressed() Methode drin ist "gelagert" wird und nicht außerhalb, also in der GUI Klasse, außerhalb der Methode. Ich hoffe meine "Hypothese" war verständlich.
 

Joose

Top Contributor
Kann es sein, dass der Wert nicht in andere Klassen "kommen" kann, weil der Wert nur in der Variable, die in der mousePressed() Methode drin ist "gelagert" wird und nicht außerhalb, also in der GUI Klasse, außerhalb der Methode. Ich hoffe meine "Hypothese" war verständlich.
Zeig uns doch den Code dazu, sonst würden wir nur raten. Aber ja werte zwischen Objekten austauschen ist möglich, und ja möglicherweise hast du da einen Fehler.
 

DaCrazyJavaExpert

Bekanntes Mitglied
Jaaaa. Ich habe mich schon gewundert warum du dort eine Variable mit gleichem Namen hattest. Du solltest die natürlich in der anderen Klasse setten.
Das verstehe ICH jetzt nicht so ganz.
Zeig uns doch den Code dazu, sonst würden wir nur raten. Aber ja werte zwischen Objekten austauschen ist möglich, und ja möglicherweise hast du da einen Fehler.
Ok also hier ist der relevante Code der GUI Klasse.
Java:
private long anzahlCookies; //Hier: Anlegung  der Variable

this.lblAnzahlCookies = new JLabel("Cookies: " + getAnzahlCookies());//Hier das Label, in dem die Variable gebraucht wird. (Aber wohl eher auch nicht so wichtig für die Lösung des Problems)

//Ich hab Tatsächlich noch diese Methode, welche im Konstruktor der GUI Klasse aufgerufen wird.
private void initialVariables() {
        this.cookiesProClick = Database.getCookies_Pro_Klick();
        this.anzahlCookies = Database.getAnzahl_Cookies(); //Ich glaube das hier kann schonmal ein Indiz sein, sagt mir bis dato aber auch noch nicht so viel
    }

//hier getter + setter der anzahlCookies Variablen
    public long getAnzahlCookies() {
        return anzahlCookies;
    }

    public void setAnzahlCookies(long anzahlCookies) {
        this.anzahlCookies = anzahlCookies;
    }

Und hier dann der Listener:
            @Override
            public void mousePressed(MouseEvent e) {
                anzahlCookies += cookiesProClick; //Die Anzahl der Cookies um cookiesProClick erhöhen. Wobei der Defaultwert 0 ist und eigentlich 1 sein sollte.
                lblAnzahlCookies.setText("Cookies: " + anzahlCookies); //"Zahl"/Text vom cookieAnzahl label aktualisieren.
                lblCookie.setVisible(false);
                lblCookieClicked.setVisible(true);
                Database.registerConnectionInListener(); //Wenn Cookie geklickt wird, Daten in Datenbank aktualisieren/überschreiben.
            }
//Die Anzeige auf dem Label wird, wie gesagt, bei jedem Klick um 1 addiert. Allerdings wohl nicht die Variable, welche ich in der Methode registerConnectionInListener() aufrufe.
So viel zum relevanten Code.
Danke!
 

JStein52

Top Contributor
anzahl_Cookies = resultSet.getLong("ANZAHL_COOKIES"); //Daten holen

Und das hatte ich gemeint mit der gleichen Variablen. Du holst dir die Daten aus der Database-Klasse scheinbar im Konstruktor deiner GUI-Klasse. Also vermutlich bevor du den Datanbankselect gemacht hast. Und dann nie mehr wieder ??
 

DaCrazyJavaExpert

Bekanntes Mitglied
anzahl_Cookies = resultSet.getLong("ANZAHL_COOKIES"); //Daten holen

Und das hatte ich gemeint mit der gleichen Variablen. Du holst dir die Daten aus der Database-Klasse scheinbar im Konstruktor deiner GUI-Klasse. Also vermutlich bevor du den Datanbankselect gemacht hast. Und dann nie mehr wieder ??
Ja stimmt, ich hole Die Daten bei Programmstart aus der Datenbank, welche dann als Varaiblen-Werte in der inialisiereVariablen()-Methode gesetzt werden. Und durch den aufruf der Methode im Konstruktor werden die Werte auf der GUI angezeigt. Aber ich selecte zuerst und rufe dann die Methode auf, da die registerConnectionInMain() Methode vor der GUI in der Main Klasse aufgerufen wird.
Java:
public class Main {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Database.registerConnectionInMain(); //Datenbank "registrieren", also Daten holen und in Programm (GUI) einsetzen
                    CookieClickerGUI frame = new CookieClickerGUI();    
                    frame.start(); // Fenster sichtbar machen
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}
 

JStein52

Top Contributor
Und was macht die hier ?
Code:
public class Database {
   
    private static CookieClickerGUI guiVarObject = new CookieClickerGUI();
du setzt die Ergebnisse des Select bei dieser Instanz der Gui
 

DaCrazyJavaExpert

Bekanntes Mitglied
Und was macht die hier ?
Code:
public class Database {
 
    private static CookieClickerGUI guiVarObject = new CookieClickerGUI();
du setzt die Ergebnisse des Select bei dieser Instanz der Gui
Achso, also dadurch, dass ich ein Objekt der GUI-Klasse schon vor dem Select erstelle/brauche, werden die Variablen schon vorher initialisiert. Ok. Ich versteh nur nicht so ganz wieso das so schlimm ist. Danach ändere ich die doch wieder? Oder etwa nicht? Ändere ich gar nicht diese Variablen, sondern nur diese Instanzen (?) davon?

EDIT: Muss ich also, bei jedem Klick auf den Cookie nochmal die setterMethode ausführen, um die Eerte auch im Konstruktor zu ändern?
 

DaCrazyJavaExpert

Bekanntes Mitglied
Und wie kann ich dann auf die selbe Instanz, also die "frame"-Instanz zugreifen? Much ich dafür in der Database-Klasse eine Instanz von der GUI-Klasse mit dem gleichen namen, also frame erstellen bzw. meine jetztzige Instanz "guiVarObject" durch "frame" ersetzen? ... Ok das geht schonmal nicht.
 

JStein52

Top Contributor
Ok das geht schonmal nicht.
Genau. Jetzt wäre der Zeitpunkt für ein Refactoring ;);)
Du machst eine Klasse die für die Anzeige deiner Daten zuständig ist (GUI) und erzeugst in main eine Instanz davon.
Diese Klasse GUI erzeugt in ihrem Konstruktor eine Instanz der Klasse Database und merkt sich die Referenz darauf.
In der Database-Klasse hälst du die Attribute die du in der Datenbank speicherst, anzahlCookies und das andere. Und dafür machst du in der Database-Klasse getter und setter. Die werden von der GUI verwendet. Dann machst du in der Database-Klasse eine Methode save, in der schreibst du die werte in die Datenbank.

Edit: und die meisten Teile dafür hast du in irgendeiner Form ja jetzt schon aber unglücklich verteilt
 

DaCrazyJavaExpert

Bekanntes Mitglied
Du machst eine Klasse die für die Anzeige deiner Daten zuständig ist (GUI) und erzeugst in main eine Instanz davon.
Java:
CookieClickerGUI frame = new CookieClickerGUI();//In der Main-Klasse
Diese Klasse GUI erzeugt in ihrem Konstruktor eine Instanz der Klasse Database und merkt sich die Referenz darauf.
Java:
    public CookieClickerGUI() { //im Konstruktor der Main...
        Database database = new Database(); //Eine Instanz der Database-Klasse, mit der Referenz
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationByPlatform(true);
        this.setSize(FRAME_WIGHT, FRAME_HIGH);
        this.initialVariables();
        this.initialComponents();
        this.addComponetsToPanelOverlay();
        this.registerCookieListener();
    }
In der Database-Klasse hälst du die Attribute die du in der Datenbank speicherst, anzahlCookies und das andere.
Also hier, oder?
Java:
    private static String id; //Eigentlich useless, hab ich nur des...irgendwas... halber
    private static int cookies_Pro_Klick; //Hier die Attribute
    private static long anzahl_Cookies; //Hier das zweite relevante Attribut
Und dafür machst du in der Database-Klasse getter und setter.
Java:
public static int getCookies_Pro_Klick() {
        return cookies_Pro_Klick;
    }

    public static void setCookies_Pro_Klick(int cookies_Pro_Klick) {
        Database.cookies_Pro_Klick = cookies_Pro_Klick;
    }

    public static long getAnzahl_Cookies() {
        return anzahl_Cookies;
    }

    public static void setAnzahl_Cookies(int anzahl_Cookies) {
        Database.anzahl_Cookies = anzahl_Cookies;
    }

Die werden von der GUI verwendet.
Also bisher so:
Java:
//in der Methode initialVariables(), welche im GUI-Konstruktor aufgerufen wird.
    private void initialVariables() {
        this.cookiesProClick = Database.getCookies_Pro_Klick();
        this.anzahlCookies = Database.getAnzahl_Cookies();
    }
Dann machst du in der Database-Klasse eine Methode save, in der schreibst du die Werte in die Datenbank.
Ok, Hirn anstrengen:confused:. Das kam bei raus:
Java:
//Ich hab diese Methode save, ich bin mir irgendwie sicher, dass ich irgendein Unsinn gemacht habe
public void save() {
        guiVarObject.setCookiesProClick(cookies_Pro_Klick); //Daten in GUI schreiben
        guiVarObject.setAnzahlCookies(anzahl_Cookies); //Daten in GUI schreiben
    }

//Und hier der Aufruf von save() im Konstruktor von der GUI-Klasse
public CookieClickerGUI() {
        Database database = new Database();
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationByPlatform(true);
        this.setSize(FRAME_WIGHT, FRAME_HIGH);
        this.initialVariables();
        this.initialComponents();
        this.addComponetsToPanelOverlay();
        this.registerCookieListener();
        database.save(); //
    }
... Und es klappt nicht, wäre auch zu schön gewesen.
+ Exception. Irgenwie sieht die Methode ave bei mir Blödsinnig aus.

#EDIT: Ok diese save Methode ist schonmal sehr dumm. Keine Ahnung was ich mir dabei gedacht habe. Ich hab jetzt diese Methode:
Java:
public static void save(PreparedStatement updateValues) throws SQLException {
        updateValues.setInt(1, guiVarObject.getCookiesProClick());
        updateValues.setLong(2, guiVarObject.getAnzahlCookies());
    }
//Ich habe einfach ein Refactoring durchgeführt, sieht aber immernoch nicht so sinnig aus, vorallem weiß ich nicht was ich als Parameter eintragen soll. Also weiter probieren.
 
Zuletzt bearbeitet:

JStein52

Top Contributor
Code:
private static String id; //Eigentlich useless, hab ich nur des...irgendwas... halber
    private static int cookies_Pro_Klick; //Hier die Attribute
    private static long anzahl_Cookies; //Hier das zweite relevante Attribut
überall static raus
 

JStein52

Top Contributor
Code:
public static int getCookies_Pro_Klick() {
        return cookies_Pro_Klick;
    }

    public static void setCookies_Pro_Klick(int cookies_Pro_Klick) {
        Database.cookies_Pro_Klick = cookies_Pro_Klick;
    }

    public static long getAnzahl_Cookies() {
        return anzahl_Cookies;
    }

    public static void setAnzahl_Cookies(int anzahl_Cookies) {
        Database.anzahl_Cookies = anzahl_Cookies;
    }
Überall static raus. Und Database.<irgendwas> wird dann automatisch fals, da lässt du Database. weg
 

JStein52

Top Contributor
Im Konstruktor von Database machst du dann das was du bisher in diesem DatabaseConnectionInMain oder so ähnlich gemacht hast, d.h. deine Tabelle evtl. anlegen (Vereinfacht mit CREATE TABLE IF NOT EXIST ...) und SELECT * FROM ...) und Ergebnis aus dem Result-Set in die Variablen von Database (!!!) speichern
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Cast-Fehler: Spring Data exists.... boolean??? Datenbankprogrammierung 1
T compiler fehler: should be mapped with insert="false" update="false" Datenbankprogrammierung 1
O Create Table per JDBC Fehler: ORA-00922 Datenbankprogrammierung 4
H Fehler bei getConnection zu MySQL Datenbank Datenbankprogrammierung 18
S MySQL Hibernate: Fehler bei Verwendung von 2 unterschiedlichen Enumration Datenbankprogrammierung 3
S @OneToMany @JoinTable failed to lazily initialize a collection Fehler Datenbankprogrammierung 2
C Oracle Fehler beim list.add() Datenbankprogrammierung 5
das_leon MySQL Fehler bei der Zeitzone Datenbankprogrammierung 7
M SQL-Statement SQL mit Java, Update Fehler Datenbankprogrammierung 1
L MySQL Bekomme einen Fehler beim ResultSet Datenbankprogrammierung 12
L SQL Fehler (Table/View does not exist) Datenbankprogrammierung 17
P MySQL JPA / MySQL - Fehler bei type=innoDB Datenbankprogrammierung 8
Thallius MySQL Wo ist der Fehler in dem Query? Datenbankprogrammierung 2
B JPA->fehler beim Insert in die Datenbank Datenbankprogrammierung 3
V Fehler beim Generierung Fehler beim Generierung java.lang.ArrayIndexOutOfBoundsException: 0 Datenbankprogrammierung 12
M MySQL-Syntax-Fehler Datenbankprogrammierung 1
H HSQLDB Beim öffnen folgender Fehler: ... java.lang.NullPointerException Datenbankprogrammierung 1
Z Finde den Fehler: Daten aus einer Access-Datenbank lesen Datenbankprogrammierung 12
W Jackcess Fehler Datenbankprogrammierung 1
I Fehler bei Ausgabe der Daten aus der DB Datenbankprogrammierung 3
J SQL-Statement Meine insert befehle funktionieren nicht und ich weiß nicht wo der fehler liegt Datenbankprogrammierung 5
serjoscha MySQL Eine Instanz von eigenem DBWrapper -> Fehler durch mehrfachbenutzung möglich? Datenbankprogrammierung 2
M Wo ist mein Fehler ? o: Datenbankprogrammierung 4
C H2 Syntax fehler beim erstellen einer Tabelle Datenbankprogrammierung 4
T JDBC Fehler Datenbankprogrammierung 2
Neumi5694 Java + MS Access + 64 Bit = Fehler -1073740777 Datenbankprogrammierung 2
T Fehler beim ausgeben von Tabellen Inhalt Datenbankprogrammierung 9
R Fehler 2601 trotz SQL-UPDATE ? Datenbankprogrammierung 2
B JDBC Connection Fehler Datenbankprogrammierung 8
J Fehler bei mySQL Query Datenbankprogrammierung 19
D Oracle PLSQL Block Fehler Datenbankprogrammierung 11
P SQL-Statement Bei meinem Statement ist ein Fehler? Datenbankprogrammierung 2
S Fehler mit JdbcRowSet Datenbankprogrammierung 2
A Oracle Unbekannter Fehler bei insert Befehl Datenbankprogrammierung 3
B MySQL Fehler: Cannot open connection mit Tomcat7, Hibernate und MySQL Datenbankprogrammierung 4
M PL/SQL Fehler "Kein Wert zurückgegeben" Datenbankprogrammierung 4
S 2 Tabellen zu einer zusammenführen, INSERT INTO Fehler Datenbankprogrammierung 5
Crashbreaker MySQL MySQL - Hibernate gibt Fehler aus Datenbankprogrammierung 25
M Access Update Statement Fehler update -> unmöglich? Datenbankprogrammierung 3
I Derby/JavaDB Update Fehler Datenbankprogrammierung 4
N Update Prepared Statement Fehler bei Argumenten Datenbankprogrammierung 3
D JDBC Fehler beim laden der nativen Bibliothek db2jcct2 Datenbankprogrammierung 9
N Oracle Fehler Ungültiges Zeichen Datenbankprogrammierung 2
jgh Zeichensatz-Fehler Datenbankprogrammierung 10
L Derby/JavaDB Fehler beim Erstellen einer Tabelle Datenbankprogrammierung 2
F hsqldb Fehler - unknown source Datenbankprogrammierung 11
E Fehler- Komme nicht auf Datenbank Datenbankprogrammierung 13
trash ResultSet Syntax Fehler Datenbankprogrammierung 11
trash JDBC Einbinden Fehler Datenbankprogrammierung 9
B Fehler in Stored Procedure Datenbankprogrammierung 7
E [ACCESS ODBC] INSERT INTO Fehler Datenbankprogrammierung 4
E Nach Server wechsel Datenbank fehler ?!? Datenbankprogrammierung 3
H Fehler bei null-Datum in MySQL-DB Datenbankprogrammierung 2
B SQL - Ich kann die Fehler nicht finden Datenbankprogrammierung 3
K DB2 Insert mit Subselect Fehler Datenbankprogrammierung 2
M Update mysql Fehler ?? Datenbankprogrammierung 4
T Fehler im SQL ... Datenbankprogrammierung 8
J Fehler bei Hibernate Configuration Datenbankprogrammierung 9
N group by fehler Datenbankprogrammierung 4
P SQL Fehler helft mir bitte Datenbankprogrammierung 12
F Fehler bei Stored Function Datenbankprogrammierung 2
S Fehler beim Auslesen von Daten Datenbankprogrammierung 6
C Wo ist der Fehler? Datenbankprogrammierung 5
H Fehler mit ". Microsoft Access Driver" Datenbankprogrammierung 12
K Fehler bei Rückgabewerten Datenbankprogrammierung 3
M Statemend Fehler Datenbankprogrammierung 11
H Beim insert bekomme ich den Fehler missing select keyword Datenbankprogrammierung 2
E Seltsamer Fehler Datenbankprogrammierung 10
T Fehler bei Verbindungsaufbau zu MySql DB Datenbankprogrammierung 4
S Fehler bei DB Verbindung Access Datenbankprogrammierung 6
A JDBC-Fehler "Objekt bereits geschlossen" Datenbankprogrammierung 4
O SQL-Query bringt Fehler Datenbankprogrammierung 4
B MySql DELETE Anweisung gibt Fehler zurück Datenbankprogrammierung 7
A Fehler beim Starten des Servers für H2 Database Datenbankprogrammierung 13
A Fehler in der HSQLDB Datenbankprogrammierung 6
B fehler bei select befehl Datenbankprogrammierung 5
G SQL fehler -> woran liegt das? Datenbankprogrammierung 3
M Odbc und Fehler Datenbankprogrammierung 44
M Fehler bei der Verbindung zu einer MSSQL/Express Datenbank! Datenbankprogrammierung 17
D mySQL emullierte PreparedStatements haben Fehler unter Last Datenbankprogrammierung 3
F Fehler in Suns FilteredRowSet Implementierung? Datenbankprogrammierung 11
R Fehler in der Eingabe? Datenbankprogrammierung 3
J Fehler bei Oracle-Datenbankverbindung Datenbankprogrammierung 2
E JDBC Oracle Fehler, zugriff auf datenbank (Cluster) Datenbankprogrammierung 5
P Fehler: result-set zeigt auf null, aber warum Datenbankprogrammierung 4
G Fehler in der select-Abfrage Datenbankprogrammierung 3
G Fehler beim Verbinden Datenbankprogrammierung 4
D Primary-Key -> Fehler: "Unique constraint violation& Datenbankprogrammierung 12
E Fehler in der SQL-Anweisung Datenbankprogrammierung 11
A Fehler in der Datenbankklasse Datenbankprogrammierung 14
M insert befehl funzt nicht!wo ist der fehler? Datenbankprogrammierung 5
N Fehler beim matchen von Strings via Query Datenbankprogrammierung 2
L komischer Fehler von ResultSet. Datenbankprogrammierung 2
R Fehler in Datenbankanbindung Servlet -> Access Datenbankprogrammierung 5
E Fehler bei String-Insert in MySQL-DB Datenbankprogrammierung 8
G Wo ist hier der Fehler (createStatement) Datenbankprogrammierung 2
M executeBatch() - Inserts trotz Fehler weitermachen Datenbankprogrammierung 5
W Fehler bei Insert Anweisung obwohl getestet Datenbankprogrammierung 3
J Fehler beim PreparedStatement Datenbankprogrammierung 2
H Java/Access - Fehler bei der Parameterübergbe Datenbankprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben