2016-04-27 10 views
0

質問があるsqliteのデータベースがあります。各質問には、件名、質問、回答、およびレベルの列があります。現時点では、私は科目を尋ねることができ、テキストで私を印刷します。ただし、常に同じ質問が選択されます。問題の数学に属するランダムな質問を選択するにはどうすればよいですか? 私のコードは、現時点では次のようになります。sqliteデータベースの共通の特性を持つランダムなデータを1つ選択してください。

question = new TextField(); 
    question.setPrefWidth(400.0); 
    question.setPrefHeight(70.0); 
    question.setStyle("-fx-font: 30 timesnewroman; -fx-base: #190707;-fx-text-fill: black;"); 




    startTestButton = new Button("START"); 
    startTestButton.addEventHandler(ActionEvent.ACTION, (e)-> { 

     counterQuestions = nQTextField.getText(); 
     System.out.println("Number of questions: " + counterQuestions); 

     try 
     { 
      String sql = "select * from Questions where Subject = ?"; 
      PreparedStatement pst = connectionQuestions.prepareStatement(sql); 
      pst.setString(1,SsubjectTestField.getText()); 
      ResultSet rs = pst.executeQuery(); 
      if(rs.next()) 
      { 
       question.setText(rs.getString("Question")); 
      } 
      else 
      { 
       System.out.println("No data for this subject"); 
      } 
     } 
     catch(Exception a) 
     { 
      System.out.println(a); 
     } 


     primaryStage.setScene(sceneMathTest); 


    }); 
    startTestButton.setPrefWidth(200.0); 
    startTestButton.setPrefHeight(50.0); 
    startTestButton.setStyle("-fx-font: 30 timesnewroman; -fx-base: #2EFE64; -fx-text-fill: black;"); 

    createTestButtonPane.add(startTestButton,5,6); 

私が使用fraseがある:、「件名=質問SELECT * FROM?」しかし*それらのすべてを意味しますが、それは常に同じものを選んでいます。

ありがとうございます。

答えて

0

rs.next()を呼び出すと、結果セットの最初のものだけが選択されます。データベースが常に同じ順序でそれらを取得する場合、データベースは常に同じものを取得します。 (そして、ちなみに、*はすべての行ではなく、すべての行を意味し、取得する行はwhere句で決まります)。

データベースに多数のデータがない場合は、ちょうどリストにすべてのものを選択し、リストのランダムな要素を選択してください:あなたは、データベース内のアイテムの非常に多くを持っている場合は、メモリにそれらすべてをロードしますよう

ResultSet rs = pst.executeQuery(); 
    List<String> allQuestions = new ArrayList<>(); 
    while(rs.next()) 
    { 
     allQuestions.add(rs.getString("Question")); 
    } 
    if (allQuestions.isEmpty()) { 
     System.out.println("No data for this subject"); 
    } else { 
     Random random = new Random(); 
     question.setText(allQuestions.get(random.nextInt(allQuestions.size()))); 
    } 

が、これは、しかし、悪い選択肢であります。その場合は、データベースから特定の行を選択するためにSQLトリックを使用することができます。あなたはその後、1の間の乱数と返された値を選択し、その特定の行を取得するにはHow to select the nth row in a SQL database table?に技術を使用

SELECT COUNT(*) FROM Questions WHERE Subject = ? 

を使用して最初のすべての行の数を取得することができます。

+0

ありがとうございました。非常に有用な –

関連する問題