データベースからオブジェクトを取得するのに役立つ関数がいくつかあります。resultSet.next()は、テーブルにデータが格納されていてもfalseを返します。
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();
}
}
奇妙なことは、私は、データを知っている、あるは二つの理由が存在しない:
私のプログラムは、それが存在しない場合、エントリを作成しようとしが、それが与えるしようユニーク制約に従わないエラー。私のSQLiteのDBブラウザでクエリを実行する
だけで正常に動作します:
これは、ファイルベースのデータベースであるように私は非常に、これはコミットされていないデータの問題であることを疑いますそのファイルをテキストエディタで開くと、データ内のユーザー名のインスタンスが表示されます。あなたはここで何をしているかの密接
"エントリが存在しない場合は、プログラムがそのエントリを作成しようとしますが、ユニークな制約が適用されていないというエラーが表示されます。**" - つまり、 **存在しない(そうでなければ、それを作成しようとせず、一意的な制約違反となる)が、ユニーク制約は 'beam_id'の代わりにまたは 'beam_id'に加えて' id'にある可能性が高い –