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]