所以我有一个这样制作的数据库
{ Material 名称;数量}
我还有一个 Java 中的 JTable,可以从数据库 (SQLite) 上传信息。当我编辑表中的单元格时,它会以这种方式自动更新数据库:
//table listener
public void tableChanged(TableModelEvent e) {
//gets row and column if the table is edited
int row = e.getFirstRow();
int column = e.getColumn();
//change in sqlite
if (column == 1) {
int value = Integer.parseInt(table.getModel().getValueAt(row, column).toString());
String materialId = table.getModel().getValueAt(row, column-1).toString();
try (Connection c = DriverManager.getConnection("jdbc:sqlite:database.db"); Statement statement = c.createStatement()) {
String sql = "UPDATE MATERIALS set QUANTITY = " + value + " where MATERIAL='" + materialId +"';";
statement.executeUpdate(sql);
statement.close();
c.close();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
else if (column == 0) {
int value = Integer.parseInt(table.getModel().getValueAt(row, column+1).toString());
String materialId = table.getModel().getValueAt(row, column).toString();
try (Connection c = DriverManager.getConnection("jdbc:sqlite:database.db"); Statement statement = c.createStatement()) {
String sql = "UPDATE MATERIALS set MATERIAL = " + materialId + " where MATERIAL='" + materialId +"';";
statement.executeUpdate(sql);
statement.close();
c.close();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
}
数量更新后就可以了。但是,一旦更新了 Material 名称,我不知道应该如何在数据库中更新它。
String sql = "UPDATE MATERIALS set MATERIAL = " + materialId + " where MATERIAL='" + materialId +"';";
也许有办法保存该值的先前值?我不能使用 Material 的数量,因为它们可能会重复。
如果可能的话,我希望避免向对象添加 ID。
最佳答案
此声明:
String sql = "UPDATE MATERIALS set MATERIAL = " + materialId + " where MATERIAL='" + materialId +"';"
有两(三)个问题。
“旧”值和"new"值相同。你有一个逻辑问题。
WHERE 部分像字符串类型一样连接,但 SET 部分则不然
串联是邪恶的。正确的做法是
String sql = "UPDATE MATERIALS set MATERIAL = ? where MATERIAL= ?"; PreparedStatement prepstmt = conn.prepareStatement(sql); prepstmt .setString(1, newMatewrial); prepstmt .setString(2, oldMaterial); prepstmt .executeUpdate();
逻辑问题必须在你的构思中得到解决。
看来主要问题是基本上不使用ID。关系数据库中的每一行都应该有稳定的主键(像你说的ID)。名称不是主键,因为可以更改。
WHERE 部分应使用 ID 而不是名称。
编辑:在我看来,好的 JTable 模型是解决您的问题的一种方法。
也许automagic默认的表模型太差了。实现 Row 的类应该多一个可以(或不)不可见的列(ID)。
我的英语不太流利,无法在 SO 帖子中教授关系数据库和 Swing。
第二个小代码片段没有显示您的应用程序概念。 在 google 中阅读有关自定义 JTable 模型的内容。
非常基本的示例: http://www.java2s.com/Code/Java/Swing-JFC/TablewithacustomTableModel.htm
关于java - 在 Java 中更新单行数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40447951/