Как использовать метод resultset.next после выполнения result.beforeFirst в Java с использованием MySQL - PullRequest
0 голосов
/ 09 марта 2011

Мне нужна помощь о том, как вернуться к следующей записи в наборе результатов, возвращаемом Java. Я использую базу данных MySQL.

Вот код внутри события формы. Где я загружаю первый набор результатов, который возвращается:

if (rs.next()) {
                jLabel5.setText(rs.getString("Question"));
                jRadioButton1.setText("A. " + rs.getString("A"));
                jRadioButton2.setText("B. " + rs.getString("B"));
                jRadioButton3.setText("C. " + rs.getString("C"));
                jRadioButton4.setText("D. " + rs.getString("D"));

             }

А вот кнопка, которая должна использоваться для прокрутки вперед по базе данных. Мне нужно выполнить rs.beforeFirst, потому что вещи, которые отображаются в jFrame, не совпадают с переменной, которую я пытаюсь проверить:

   try {




            rs.beforeFirst();

            if (rs.next()) {


                jLabel5.setText(rs.getString("Question"));
                jRadioButton1.setText("A. " + rs.getString("A"));
                jRadioButton2.setText("B. " + rs.getString("B"));
                jRadioButton3.setText("C. " + rs.getString("C"));
                jRadioButton4.setText("D. " + rs.getString("D"));





    if (jRadioButton1.isSelected()) {

                        rval = jRadioButton1.getText().charAt(0);
                        if (String.valueOf(rval).equalsIgnoreCase(rs.getString("Answer"))) {
                           JOptionPane.showMessageDialog(null, "Correct! Your answer is " +  rval + " answer is: " + rs.getString("Answer"));


                        } else {
                           JOptionPane.showMessageDialog(null, "Wrong! your answer is " + rval + " answer is: " +  rs.getString("Answer"));
                        }

                }

                }

            }catch (Exception e) {
            e.printStackTrace();
        }

У меня вопрос, как мне продолжать прокручивать базу данных? Потому что набор результатов не прогрессирует, когда я использую rs.beforeFirst () перед rs.next () Я также попытался сделать:

while(rs.next()){...}

Это сработало, но не позволило мне выбрать то радио, которое я хочу. И он продолжал выполняться до конца набора результатов даже без ручного нажатия на кнопку (для прокрутки) несколько раз. Пожалуйста, помогите мне выяснить, как это можно решить. Если вам нужно больше деталей, просто спросите. Спасибо.

1 Ответ

1 голос
/ 09 марта 2011

Вы не должны смешивать логику доступа к базе данных с логикой представления. Это приводит только к жестко связанному коду, где обе проблемы только сталкиваются друг с другом. Работа с базой данных должна быть выполнена как можно скорее.

Вы должны разделить проблемы.

Сначала создайте класс, который представляет одну строку базы данных.

public class Question {
    private String text;
    private String answer;
    private String optionA;
    private String optionB;
    private String optionC;
    private String optionD;

    // Add/generate c'tors/getters/setters/equals/hashcode and other boilerplate.
}

(немного приличная среда IDE, подобная Eclipse, может генерировать их автоматически)

Затем создайте класс, который выполняет следующую работу JDBC:

public List<Question> list() throws SQLException {
    List<Question> questions = new ArrayList<Question>();
    // ...

    try {
        // ...

        while (resultSet.next()) {
            Question question = new Question();
            question.setText(resultSet.getString("Question"));
            question.setAnswer(resultSet.getString("Answer"));
            question.setOptionA(resultSet.getString("A"));
            question.setOptionB(resultSet.getString("B"));
            question.setOptionC(resultSet.getString("C"));
            question.setOptionD(resultSet.getString("D"));
            questions.add(question);
        }
    } finally {
        // ...
    }        

    return questions;
}

Наконец, просто поработайте с List<Question> прямым путем.

List<Question> questions = questionDAO.list();
int size = questions.size();
JOptionPane.showMessageDialog(null, "There are " + size + " questions!");

for (Question question : questions) {
    jLabel5.setText(question.getText());
    jRadioButton1.setText("A. " + question.getOptionA());
    jRadioButton2.setText("B. " + question.getOptionB());
    jRadioButton3.setText("C. " + question.getOptionC());
    jRadioButton4.setText("D. " + question.getOptionD());
    // ...
}

Нет необходимости массировать результаты вперед и назад.

...