无论SQLException是否依赖于我们检索的值

时间:2017-04-28 18:35:06

标签: java sqlite jdbc arraylist

我正在使用方法getTasksDay(LocalDate day),它返回List来自我自己的班级HomeworkTask的对象(如下所示)。当列表中的SQLException: The database has been closed之一对其done属性具有值HomeworkTasks时,我会在下一个数据库查询中获得true。但是,当所有这些值都是false时,一切正常。

我不知道应该怎么做才能解决这个问题,修复意味着无论布尔值是多少,它都应该正常工作。此外,有人可以解释这种行为吗?

我尝试了什么

  1. 当我不关闭连接或语句时,没有database has been closed错误,所以你可以说它有效。但是,这可能会导致像the database has been locked这样的异常或类似的事情,并且与数据库建立多个开放连接并不是一个好主意。

  2. 让此方法返回值为false的所有作业任务,并让另一个方法返回带有布尔值的ArrayList。然后将这些布尔值设置为HomeworkTask done属性的值。这仍然会产生同样的问题。即使将布尔值更改为true完全发生在与数据库的连接之外,我也看不出它会如何影响数据库行为。

  3. 使用四个值ArrayListArrayList<String>done,{{1}创建一个返回task label的其他方法作为字符串。然后让color调用该方法,然后使用这些字符串值创建并返回HomeworkTasks列表。然而,同样的错误。

  4. 一般来说,从数据库中检索数据后使用数据会影响数据库行为。但也许我在寻找错误的地方。欢迎任何其他地方的建议。

    其他信息

    我正在使用带有SQLite(Xerial)的IntelliJ或jdbc。

    getTasksDay(LocalDate day)看起来像

    tasks

    getTasksDay方法

    id INT PRIMARY KEY, done BOOLEAN, day DATE, task CHAR(255), label CHAR(10), color CHAR(50), orderInDay INT
    

    注意:使用以下方法可以正常工作。 (但不使用数据库中的值...)

    public List<HomeworkTask> getTasksDay(final LocalDate day) {
    
            String dayString = day.toString();
            String sql = "SELECT done, task, label, color " + "FROM tasks " + "WHERE day = '"
                    + dayString + "' ORDER BY orderInDay";
            List<HomeworkTask> homeworkTasks = new ArrayList<>();
    
            setConnection();
            try {
                statement = connection.createStatement();
                ResultSet resultSet = statement.executeQuery(sql);
                while (resultSet.next()) {
    
                    HomeworkTask homeworkTask = new HomeworkTask(
                                    resultSet.getBoolean("done"),
                                    resultSet.getString("task"),
                                    resultSet.getString("label"),
                                    resultSet.getString("color"));
                    homeworkTasks.add(homeworkTask);
                }
                statement.close();
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return homeworkTasks;
        }
    
    private void setConnection() {
            try {
                Class.forName("org.sqlite.JDBC");
                connection = DriverManager.getConnection(databasePath);
    
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    

    HomeworkTaks.java

    HomeworkTask homeworkTask = new HomeworkTask(
                                        false,
                                        resultSet.getString("task"),
                                        resultSet.getString("label"),
                                        resultSet.getString("color"));
                        homeworkTasks.add(homeworkTask);
    

1 个答案:

答案 0 :(得分:0)

我认为以下列方式直接创建对象存在一些问题

 HomeworkTask homeworkTask = new HomeworkTask(
                                resultSet.getBoolean("done"),
                                resultSet.getString("task"),
                                resultSet.getString("label"),
                                resultSet.getString("color"));

相反,我更喜欢做

boolean done = resultSet.getBoolean("done");
String task = resultSet.getString("task");
String label = resultSet.getString("label");
String color = resultSet.getString("color");

HomeworkTask homeworkTask = new HomeworkTask(done,task,label,color);

如果可能的话试一试。