2017-04-16 62 views
2

我知道有相同的標題相似的線程,但我的問題地址不同點。我檢查結果集中看到如果沒有記錄在表(SQLite)使用JDBC通過檢查結果集

查詢是否從rating列返回任何值,如果是拿這個值,如果沒有附加0.0到的ArrayList(評級)它添加到arraylist

在我的代碼中,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(); 
    } 

enter image description here

回答

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

它給:

[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] 
+0

回覆:*「沒有選擇。」 - - 這很愚蠢。你已經費了很大力氣創建一個'allDates'列表;你可以很容易地創建一個'Map ',其中日期作爲鍵和值被初始化爲零,循環遍歷原始的ResultSet來填充值,然後使用Arrays.asList(dateMap.values ().toArray(new Float [0]))'將地圖的值轉換爲ArrayList。 –

+0

@GordThompson是的,我也可以這樣做..但我的主要問題是如何做到這一點,沒有循環每一個日期和做一個查詢之間使用。 – minigeek

+0

*「如何做到這一點...用一個查詢之間使用」* - 這就是我說的循環「原始ResultSet」時的意思。 –

0

這裏:

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("rating")返回的值。
如果不爲零,請執行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)); 
    } 
} 
+0

它仍然打印'[9.505962,7.734242,9.67128,5.054585]'即使是日期範圍26天 – minigeek

+0

我想查詢是錯誤的。不能肯定的是,這個是我想要但不能理解/轉換在我的情況下http://stackoverflow.com/questions/1046865/mysql-select-all-dates-in-a-range-even-if-no-records-present – minigeek