我正在使用方法getTasksDay(LocalDate day)
,它返回List
来自我自己的班级HomeworkTask
的对象(如下所示)。当列表中的SQLException: The database has been closed
之一对其done属性具有值HomeworkTasks
时,我会在下一个数据库查询中获得true
。但是,当所有这些值都是false
时,一切正常。
我不知道应该怎么做才能解决这个问题,修复意味着无论布尔值是多少,它都应该正常工作。此外,有人可以解释这种行为吗?
我尝试了什么
当我不关闭连接或语句时,没有database has been closed
错误,所以你可以说它有效。但是,这可能会导致像the database has been locked
这样的异常或类似的事情,并且与数据库建立多个开放连接并不是一个好主意。
让此方法返回值为false
的所有作业任务,并让另一个方法返回带有布尔值的ArrayList
。然后将这些布尔值设置为HomeworkTask
done属性的值。这仍然会产生同样的问题。即使将布尔值更改为true
完全发生在与数据库的连接之外,我也看不出它会如何影响数据库行为。
使用四个值ArrayList
,ArrayList<String>
,done
,{{1}创建一个返回task
label
的其他方法作为字符串。然后让color
调用该方法,然后使用这些字符串值创建并返回HomeworkTasks列表。然而,同样的错误。
一般来说,从数据库中检索数据后使用数据会影响数据库行为。但也许我在寻找错误的地方。欢迎任何其他地方的建议。
其他信息
我正在使用带有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);
答案 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);
如果可能的话试一试。