所以我有一个像这样的数据库
{MATERIAL NAME; QUANTITY}
我还有一个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();
}
}
}
数量更新时没关系。但是,一旦更新了材料名称,我就不知道如何在数据库中更新它。
String sql = "UPDATE MATERIALS set MATERIAL = " + materialId + " where MATERIAL='" + materialId +"';";
也许有办法保存该值的先前值?我不能使用可能重复的材料数量。
如果可能的话,我想避免在对象中添加ID。
答案 0 :(得分:1)
本声明:
String sql = "UPDATE MATERIALS set MATERIAL = " + materialId + " where MATERIAL='" + materialId +"';"
有两(3)个问题。
“旧”值和“新”值相同。你有一个合乎逻辑的问题。
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就像你说的那样)。名称不是主键,因为可以更改。
部分应该使用ID而不是名称。
编辑:在我看来,良好的JTable模型是解决问题的一种方法。也许自动默认表模型太差了。实现Row的类应该有一个列(ID),它可以(或不)是不可见的。
我的英语不太流利,不能教SO关系数据库和Swing。
第二个小代码片段不显示您的应用程序概念。 在谷歌上阅读自定义JTable模型。
非常基本的例子: http://www.java2s.com/Code/Java/Swing-JFC/TablewithacustomTableModel.htm
答案 1 :(得分:0)