Java 如果使用JDBC的表(SQLite)中没有记录,则通过检查resultSet将0放入arraylist
我知道同一个标题有相似的主题,但我的问题针对不同的点。我正在检查结果集以查看 查询是否从Java 如果使用JDBC的表(SQLite)中没有记录,则通过检查resultSet将0放入arraylist,java,sqlite,jdbc,arraylist,resultset,Java,Sqlite,Jdbc,Arraylist,Resultset,我知道同一个标题有相似的主题,但我的问题针对不同的点。我正在检查结果集以查看 查询是否从rating列返回任何值(如果是),获取值并将其添加到arraylist如果否,将0.0添加到arraylist(ratings)中 在我的代码中,else永远不会执行,导致arraylist中没有0.0(因为缺少日期)。我的查询在什么地方出错了吗?请帮忙 String query = "SELECT * FROM DATA WHERE (dateofday BETWEEN ? AND ?) AND id =
rating
列返回任何值(如果是),获取值并将其添加到arraylist
如果否,将0.0
添加到arraylist(ratings)中
在我的代码中,else永远不会执行,导致arraylist中没有0.0(因为缺少日期)。我的查询在什么地方出错了吗?请帮忙
String query = "SELECT * FROM DATA WHERE (dateofday BETWEEN ? AND ?) AND id = ?";
String mediapath = null;
try {
preparedStatement = connection.prepareStatement(query);
preparedStatement.setInt(3, Controller.id_logged_in);
preparedStatement.setString(1, datepickerfrom.getValue().toString());
preparedStatement.setString(2, datepickerto.getValue().toString());
resultSet = preparedStatement.executeQuery();
boolean flag = true;
if (resultSet.next()) {
do {
ratings.add(resultSet.getFloat("rating"));
countofday++;
}
while (resultSet.next());
} else {
ratings.add(Float.valueOf(0));
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
connection.close();
}
此处:
if (resultSet.next()) {
do {
ratings.add(resultSet.getFloat("rating"));
countofday++;
}
while (resultSet.next());
} else {
ratings.add(Float.valueOf(0));
}
如果在resultSet中至少有一个结果,则迭代所有结果,但从不在ratings.add(Float.valueOf(0))中输入代码>因为只有在没有结果时才输入。
应删除第一条条件语句:if(resultSet.next()){
您应该测试resultSet.getFloat(“评级”)
返回的值
如果不为空,则执行ratings.add(resultSet.getFloat(“rating”);
否则执行
ratings.add(Float.valueOf(0));
例如:
while (resultSet.next());
float ratingObj = resultSet.getFloat("rating");
if (!resultSet.wasNull()){
ratings.add(ratingObj);
countofday++;
}
else{
ratings.add(Float.valueOf(0));
}
}
暂时,我用这种低效的方式查询每个日期。别无选择
SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String date1 = datepickerfrom.getValue().toString();
String date2 = datepickerto.getValue().toString();
try {
Date d1 = myFormat.parse(date1);
Date d2 = myFormat.parse(date2);
while( d1.before(d2) ){
d1 = addDays(d1, 1);
allDates.add(d1);
allDatesString.add(formatter.format(d1));
}
//System.out.println(allDatesString);
} catch (ParseException e) {
e.printStackTrace();
}
for(int i = 0; i < allDatesString.size(); i++) {
String query = "SELECT * FROM DATA WHERE dateofday = ? AND id = ?";
try {
preparedStatement = connection.prepareStatement(query);
preparedStatement.setInt(2, Controller.id_logged_in);
preparedStatement.setString(1, allDatesString.get(i));
resultSet = preparedStatement.executeQuery();
if(resultSet.next())
ratings.add(resultSet.getFloat("rating"));
else
ratings.add(Float.valueOf(0));
} catch (SQLException e) {
e.printStackTrace();
}
}
尽管daterange为26天,但它仍在打印[9.505962,7.734242,9.67128,5.054585]
我猜查询是错误的。虽然不确定,但这是我想要的,但无法理解/转换,在我的例子中是:“别无选择。”-那太傻了。你已经在费劲地创建一个allDates
列表;你可以同样轻松地创建一个Map
,日期作为键,值初始化为零,循环原始结果集来填充值,然后使用Arrays.asList(dateMap.values().toArray(新浮点[0])
将地图的值转换为ArrayList。@GordThompson是的,我也可以这样做。。但我的主要问题是如何做到不在每个日期循环,不使用一个查询,而是使用between。“如何做到……使用一个查询,使用between”-这就是我说循环“原始结果集”时的意思。
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.505962, 0.0, 0.0, 0.0, 0.0, 7.734242, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9.67128, 0.0, 5.054585, 0.0, 0.0, 0.0]