Ich habe ein paar Funktionen, die beim Abrufen der Objekte aus der Datenbank helfen.resultSet.next() gibt false zurück, obwohl die Tabelle ausgefüllt ist
public User getUser(int beamID) throws NoSuchUserException {
return userFromResultSet(getUserResultSet(beamID));
}
private ResultSet getUserResultSet(int beamID) {
try(Connection conn = dataSource.getConnection()) {
// queries.getUserByBeamID() returns "SELECT * FROM user WHERE beamID=?"
PreparedStatement stmt = conn.prepareStatement(queries.getUserByBeamID());
stmt.setInt(1, beamID);
System.out.println(stmt.toString());
return stmt.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
throw new IllegalStateException();
}
}
private User userFromResultSet(ResultSet resultSet) {
try {
boolean next = resultSet.next(); // Debugger tells me this is false.
if (!next)
throw new NoSuchUserException();
User user = new User(this,
resultSet.getInt("beamID"),
resultSet.getString("name"),
resultSet.getInt("points"),
resultSet.getInt("time")
);
if (resultSet.next())
throw new IllegalStateException("Duplicate user entries exist - database integrity compromised!");
return user;
} catch (SQLException e) {
e.printStackTrace();
throw new IllegalStateException();
}
}
Das Merkwürdige ist, dass ich die Daten wissen nicht bestehen aus zwei Gründen:
Mein Programm versucht, den Eintrag zu erstellen, wenn es nicht existiert, aber versucht, das gibt ein Fehler, dass die eindeutige Bedingung nicht befolgt wird.
Ausführen der Abfrage in meinem SQLite DB-Browser funktioniert gut:
ich sehr bezweifle, dass dies ein Problem mit unbestätigten Daten, da dies eine dateibasierte ist Datenbank, und das Öffnen dieser Datei mit einem Texteditor zeigt Instanzen der Benutzernamen in den Daten.
"Mein Programm versucht, den Eintrag zu erstellen, wenn es nicht existiert, ** aber versucht, dass ein Fehler auftritt, dass die eindeutige Einschränkung nicht befolgt wird. **" - so bedeutet das, dass der Benutzer ** nicht ** existiert (oder sonst würde es nicht versuchen, es zu erzeugen, was zu der einzigartigen Beschränkungsverletzung führte), aber die eindeutige Einschränkung ist wahrscheinlich auf 'id' (anstelle von oder zusätzlich zu 'beam_id') –