Sqlite“;“数据库已锁定”;Java中的错误以及如何更新TableView
我正在编写一个动态填充JavaFX表视图的程序。一切都很好,我能够一遍又一遍地使用相同的方法用来自各种查询的信息填充多个表。我知道在这方面有很多问题,但我就是找不到这种情况的答案 然而,我的问题只有在我稍后尝试在代码中为按钮分配功能时才会出现。我能够多次从链接调用上述方法来填充多个表,并且我已经尝试显式调用连接上的.close(),并在我的各种方法中将其作为局部变量重新打开,从而在每次调用该方法时重新打开它,并将连接实例化为类变量。我只是不明白为什么我会继续接受这个领域的一切。一般来说,我对编码比较陌生,所以我确信我缺少了一些关于连接如何工作的信息 此外,如果有人对.db文件进行更改后如何更新TableView有任何提示,那也很好 下面是我使用上面答案中的代码的具体方法。我所做的唯一修改是,我为它提供了一个输入查询的参数,以及我要在其上显示我正在显示的三个表的查询结果的关联表,这对于填充表非常有用: 下面有一个上下文截图。Sqlite“;“数据库已锁定”;Java中的错误以及如何更新TableView,java,sqlite,javafx,jdbc,tableview,Java,Sqlite,Javafx,Jdbc,Tableview,我正在编写一个动态填充JavaFX表视图的程序。一切都很好,我能够一遍又一遍地使用相同的方法用来自各种查询的信息填充多个表。我知道在这方面有很多问题,但我就是找不到这种情况的答案 然而,我的问题只有在我稍后尝试在代码中为按钮分配功能时才会出现。我能够多次从链接调用上述方法来填充多个表,并且我已经尝试显式调用连接上的.close(),并在我的各种方法中将其作为局部变量重新打开,从而在每次调用该方法时重新打开它,并将连接实例化为类变量。我只是不明白为什么我会继续接受这个领域的一切。一般来说,我对编
public void buildData(String query, TableView table) {
data = FXCollections.observableArrayList();
try {
//SQL FOR SELECTING ALL OF CUSTOMER
String SQL = query;
//ResultSet
ResultSet rs = c.createStatement().executeQuery(SQL);
for (int i = 0; i < rs.getMetaData().getColumnCount(); i++) {
//We are using non property style for making dynamic table
final int j = i;
TableColumn col = new TableColumn(rs.getMetaData().getColumnName(i + 1));
col.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ObservableList, String>, ObservableValue<String>>() {
public ObservableValue<String> call(TableColumn.CellDataFeatures<ObservableList, String> param) {
return new SimpleStringProperty(param.getValue().get(j).toString());
}
});
col.setMinWidth(200);
table.getColumns().addAll(col);
System.out.println("Column [" + i + "] ");
}
while (rs.next()) {
//Iterate Row
ObservableList<String> row = FXCollections.observableArrayList();
for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
//Iterate Column
row.add(rs.getString(i));
}
System.out.println("Row [1] added " + row);
data.add(row);
}
//FINALLY ADDED TO TableView
table.setItems(data);
} catch (Exception e) {
e.printStackTrace();
System.out.println("Error on Building Data");
}
}
publicsvoidbuilddata(字符串查询,TableView表){
data=FXCollections.observearraylist();
试一试{
//用于选择所有客户的SQL
字符串SQL=query;
//结果集
ResultSet rs=c.createStatement().executeQuery(SQL);
对于(int i=0;i 对于(int i=1;i听起来与fx无关-确保您可以在不使用(普通硬编码值)的情况下更新/访问db。如果您使用外部程序更改数据库,则必须确保它已解除对数据库的锁定。
public void addTenant(String name, double leaseLength, boolean rentPaid, String propID, TableView table) {
data = FXCollections.observableArrayList();
try {
//SQL FOR SELECTING ALL OF CUSTOMER
String query = "INSERT INTO tenants VALUES (?,?,?,?)";
//ResultSet
PreparedStatement statement = c.prepareStatement(query);
statement.setString(1, name);
statement.setDouble(2, leaseLength);
statement.setBoolean(3, rentPaid);
statement.setString(4, propID);
ResultSet rs = c.createStatement().executeQuery("SELECT * FROM tenants");
for (int i = 0; i < rs.getMetaData().getColumnCount(); i++) {
//We are using non property style for making dynamic table
final int j = i;
TableColumn col = new TableColumn(rs.getMetaData().getColumnName(i + 1));
col.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ObservableList, String>, ObservableValue<String>>() {
public ObservableValue<String> call(TableColumn.CellDataFeatures<ObservableList, String> param) {
return new SimpleStringProperty(param.getValue().get(j).toString());
}
});
col.setMinWidth(200);
table.getColumns().addAll(col);
System.out.println("Column [" + i + "] ");
}
while (rs.next()) {
//Iterate Row
ObservableList<String> row = FXCollections.observableArrayList();
for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
//Iterate Column
row.add(rs.getString(i));
}
System.out.println("Row [1] added " + row);
data.add(row);
}
//FINALLY ADDED TO TableView
table.setItems(data);
} catch (Exception e) {
e.printStackTrace();
System.out.println("Error on Building Data");
}
}