Вы также можете использовать для него аниматор:
int secondsToRun = 999;
ValueAnimator timer = ValueAnimator.ofInt(secondsToRun);
timer.setDuration(secondsToRun * 1000).setInterpolator(new LinearInterpolator());
timer.addUpdateListener(new ValueAnimator.AnimatorUpdateListener()
{
@Override
public void onAnimationUpdate(ValueAnimator animation)
{
int elapsedSeconds = (int) animation.getAnimatedValue();
int minutes = elapsedSeconds / 60;
int seconds = elapsedSeconds % 60;
textView.setText(String.format("%d:%02d", minutes, seconds));
}
});
timer.start();
, когда вы закрываете объект соединения в вашем методе getProduttori
, ваш результирующий набор будет автоматически закрыт .
ResultSet rs = ProduttoreDCS.getProduttori();
= null, as you have closed the connection in getProduttori
method, which will automatically close the resultset
thus, it returns null.
From Connection # close
Освобождает базу данных объекта Connection и JDBC немедленно, вместо того, чтобы ждать их автоматического выхода.
применяется при закрытии заявления также. Для того, чтобы ваш код работал, не закрывайте Statement и Connection, пока вы не получите строки .
@ Бадшах уже показал вам стандартный способ. Если вы используете java 7+, вы можете использовать блок try-with-resource, который упростит вашу жизнь.
try(Connection conn = gettheconn){ get the statement here get the result set perform your ops } catch(SQLException ex){ ex.printstacktrace(); }
Если вы заметили, что окончательного блока нет, ваш объект соединения будет закрыт, как только вы выйдете из блока try автоматически. У вас нет необходимости в вызове экспликации Connection # close ()
В этом проблема:
stmt.close();
conn.close();
Вы закрываете соединение с базой данных. Вы не можете этого сделать, пока не прочитаете данные, иначе как ResultSet
будет читать его? Возможно, он будет читать некоторые данные для начала, но это не значит, что это отключенный объект.
В частности, из документа для ResultSet.close
:
Примечание. Объект ResultSet автоматически закрывается объектом Statement, который сгенерировал его, когда этот объект Statement закрыт, повторно выполняется или используется для извлечения следующего результата из последовательности нескольких результатов.
blockquote>
Закрытие соединения приводит к тому, что resultSet уходит.
ResultSet не является контейнером, который вы можете использовать для передачи данных, это всего лишь оболочка вокруг курсора. Вы должны запустить содержимое resultSet и скопировать их в структуру данных, а затем вернуть структуру данных. Вы уже это делаете, но вам нужно сделать это до закрытия оператора и соединения.
Измените код на:
public static List<String[]> getProduttori() throws ClassNotFoundException, SQLException {
ArrayList<String[]> res = new ArrayList<String[]>();
/*
* retrieve all record from produttori table
*/
Connection conn = null;
ResultSet rs = null;
Statement stmt = null;
String query = "SELECT * FROM produttore";
conn = ConnectionManager.getConnection();
try {
System.out.println("Connection obtained by ProduttoreDCS class");
stmt = conn.createStatement();
try {
rs = stmt.executeQuery(query);
while (rs.next()) {
String[] current = new String[6];
current[0] = Integer.toString(rs.getInt("partita_iva"));
current[1] = rs.getString("nome");
current[2] = rs.getString("cognome");
current[3] = rs.getString("via_sede");
current[4] = rs.getString("citta_sede");
current[5] = rs.getString("provincia_sede");
res.add(current);
}
return res;
} finally {
try {
stmt.close();
} catch (SQLException e) {
log.error(e);
}
}
} finally {
try {
conn.close();
} catch (SQLException e) {
log.error(e);
}
}
}
Объект ResultSet автоматически закрывается, когда объект Statement, который сгенерировал его, закрывается, повторно выполняется или используется для извлечения следующего результата из последовательности нескольких результатов.
Вы закрыли соединение, а затем выполняете итерацию, где оно равно null. Пожалуйста, прочитайте данные и затем закройте соединение.
Хорошей практикой является
Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; try { conn = stmt = conn.prepareStatement("sql"); rs = stmt.executeQuery(); //DO SOME THING HERE } catch { // Error Handling } finally { try { if (rs != null) rs.close(); } catch (Exception e) {}; try { if (stmt != null) stmt.close(); } catch (Exception e) {}; try { if (conn != null) conn.close(); } catch (Exception e) {}; }