java中sqlite“database locked”错误及tableview的更新

nwnhqdif  于 2021-07-11  发布在  Java
关注(0)|答案(0)|浏览(220)

我正在编写一个动态填充javafx表视图的程序。一切都很正常,我可以反复使用相同的方法用不同查询的信息填充多个表。我看到有很多问题,但我就是找不到解决这个问题的答案。
我的代码是基于这个问题的答案。
但是,我的问题只有在稍后尝试在代码中为按钮分配功能时才会出现。我能够多次从链接调用上述方法来填充多个表,并且我已经尝试显式地调用连接上的.close(),并在我的各种方法中将其作为局部变量重新打开,这样每次调用该方法时都会重新打开它,还将连接示例化为类变量。我只是不明白为什么我会继续接受这个地区尽管一切。一般来说,我对编码比较陌生,所以我确信我遗漏了一些关于连接如何工作的信息。
另外,如果有人对如何在对.db文件进行更改后更新tableview有任何建议,那也很好。
下面是我的具体方法,它使用上面答案中的代码。我所做的唯一修改是,我为它提供了一个输入查询的参数,以及我要在其上显示我正在显示的三个表的查询结果的关联表,这对于填充表非常有用:
下面有一个上下文截图。

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");
    }
}

数据库锁定错误的问题出现在这里,在我单击“add”按钮时使用的这个方法中,我认为使用相同的连接c会产生不同的效果,但事实并非如此。另外,如我所说,我尝试在每次使用后关闭连接在每个方法的顶部打开一个新的连接,但它仍然声称连接保持打开状态,并且数据库正忙,从而导致数据库锁定错误:

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");
    }
}

这是一个单一的功能按钮,从文本字段中提取输入。这就是为什么查询在这里是硬编码的,但是从textfield.gettext()方法中获取这些输入,以便为表添加一个“租户”(想想租金管理系统。)在最初准备好的语句之后的第二个rs是我尝试在添加到表之后从表中获取新信息,可能在表被添加到后重新填充。我无法测试这个,因为我无法使它通过sqlite数据库锁定错误
最后
以下是我的表的屏幕截图,如果这有助于将其引入上下文,我需要在“添加”租户时更新所有表,但显然只有在“添加”按钮具有功能后,由于数据库锁定错误,当前无法更新:
表格截图

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题