Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SQLException是否发生取决于我们检索的值_Java_Sqlite_Jdbc_Arraylist - Fatal编程技术网

Java SQLException是否发生取决于我们检索的值

Java SQLException是否发生取决于我们检索的值,java,sqlite,jdbc,arraylist,Java,Sqlite,Jdbc,Arraylist,我正在使用一个方法getTasksDay(LocalDate-day),该方法返回一个列表,其中包含我自己的类家庭作业任务(如下所示)中的对象。我得到一个SQLException:当列表中的一个homeworkstasks的done属性值为true时,在下一次数据库查询中数据库已关闭。但是,当所有这些值都为false时,一切正常 我不知道该怎么做才能解决这个问题,因为fix意味着不管布尔值是多少,它都可以正常工作。还有,有人能解释一下这种行为吗 我尝试过的 public List<Home

我正在使用一个方法
getTasksDay(LocalDate-day)
,该方法返回一个
列表
,其中包含我自己的类
家庭作业任务
(如下所示)中的对象。我得到一个
SQLException:当列表中的一个
homeworkstasks
的done属性值为
true
时,在下一次数据库查询中数据库已关闭。但是,当所有这些值都
为false
时,一切正常

我不知道该怎么做才能解决这个问题,因为fix意味着不管布尔值是多少,它都可以正常工作。还有,有人能解释一下这种行为吗

我尝试过的

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();
        }
    }
  • 当我不关闭连接或语句时,没有
    数据库已关闭
    错误,因此可以说它工作正常。但是,这可能会导致异常,如数据库已被锁定或类似的情况,并且与数据库有多个打开的连接不是一个好主意

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

  • 创建一个不同的方法,该方法返回
    ArrayList
    ArrayList
    ,其中四个值
    done
    task
    label
    color
    作为字符串。然后让
    getTasksDay(LocalDate-day)
    调用该方法,然后使用这些字符串值创建并返回家庭作业任务列表。同样的错误

  • 总的来说,我觉得奇怪的是,从数据库检索数据后使用数据会影响数据库行为。但也许我找错地方了。欢迎对其他地方提出任何建议

    其他信息

    我将IntelliJ与SQLite(Xerial)或jdbc一起使用

    tasks
    如下所示

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

    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

    class HomeworkTask implements Serializable {
    
        private boolean done;
        private String text;
        private String label;
        private String color;
    
        public HomeworkTask(final boolean done, final String text, final String label, final String color) {
            this.done = done;
            this.text = text;
            this.label = label;
            this.color = color;
        }
    
        public boolean getDone() {
            return done;
        }
    
        public void setDone(final boolean done) {
            this.done = done;
        }
    
        public String getText() {
            return text;
        }
    
        public void setText(final String text) {
            this.text = text;
        }
    
        public String getLabel() {
            return label;
        }
    
        public void setLabel(final String label) {
            this.label = label;
        }
    
        public String getColor() {
            return color;
        }
    
        public void setColor(final String color) {
            this.color = color;
        }
    }
    

    我认为用下面的方法直接创建对象存在一些问题

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

    如果可能的话,试试看。

    我认为用下面的方法直接创建对象会有一些问题

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

    如果可能的话,试一试。

    谢谢你的建议,我没有直接想到这一点。但是,当再次尝试访问数据库时,这仍然会引发
    数据库已关闭
    错误…您的意思是在第二次观察异常时调用“getTasksDay”方法吗?当调用从数据库获取数据的另一个方法时,会出现异常。这也可能是
    getTasksDay
    ,我认为这对尝试连接到关闭的数据库没有影响。您的连接对象是单例对象吗?如果它是单例对象,并且您在每次检索后都尝试关闭它,那么您所看到的是预期的。如果线程1打开连接并尝试重设数据,这意味着线程2使用连接执行操作,然后在线程1完成之前关闭连接,那么我们将看到SQLException:数据库已关闭感谢建议,没有直接想到这一点。但是,当再次尝试访问数据库时,这仍然会引发
    数据库已关闭
    错误…您的意思是在第二次观察异常时调用“getTasksDay”方法吗?当调用从数据库获取数据的另一个方法时,会出现异常。这也可能是
    getTasksDay
    ,我认为这对尝试连接到关闭的数据库没有影响。您的连接对象是单例对象吗?如果它是单例对象,并且您在每次检索后都尝试关闭它,那么您所看到的是预期的。如果线程1打开连接并尝试重设数据,意味着线程2使用连接执行操作,然后在线程1完成之前关闭连接,那么我们将看到SQLException:数据库已关闭