如何将SQLite与JavaFX中的文本字段和标签正确连接?

时间:2019-01-02 06:33:03

标签: java sqlite javafx scenebuilder

我正在使用JavaFX,Scene Builder和SQLite制作应用程序。为了管理SQLite数据库,我使用了数据库浏览器

我在SQLite中有3个字段:ID,问题,答案

当我按下“添加”按钮时,将调用一个方法,将带有问题的文本发送到SQLite中的问题选项卡,并使用带有应答的文本发送文本。

ID是一个数字,当我将这些字段添加到SQLite时会自动递增

我成功地从窗口发送了数据,但是我不明白如何从SQlite获取数据并将其设置为窗口中的标签和组合框

Window

DB Browser

QuestController:

package card;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;

import java.net.URL;
import java.sql.*;
import java.util.ResourceBundle;




public class QuestController implements Initializable {

  @FXML  private TextArea ta_questText, ta_answerText;

  @FXML  private Label lb_numberQuest;

  @FXML
  private ComboBox<?> idQuest;

  @Override
  public void initialize(URL location, ResourceBundle resources) {

    //register QuestController in  Context Class
    Context.getInstance().setQuestController(this);

  }

  @FXML
  void addCard(ActionEvent event) {

    PreparedStatement preparedStatement;
    ResultSet resultSet;
    String query = "select * from Cards where ID  = ? and question = ? and 
answer = ?";
Connection connection = DbConnection.getInstance().getConnection();


    try {
  String question = ta_questText.getText();
  String answer = ta_answerText.getText();

  Statement statement = connection.createStatement();

  int status = statement.executeUpdate("insert into Cards (question, 
 answer) values ('"+question+"','"+answer+"')");

  if (status > 0) {
    System.out.println("question registered");
      }

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

  }
}

DbConnection类:

package card;

import org.sqlite.SQLiteConnection;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DbConnection {

  private DbConnection() {

  }

  public static DbConnection getInstance() {

   return new DbConnection();

 }

  public Connection getConnection() {



    String connect_string = "jdbc:sqlite:database.db";

    Connection connection = null;
    try {
  Class.forName("org.sqlite.JDBC");
   connection = DriverManager.getConnection("jdbc:sqlite:database.db");
} catch (SQLException e) {
  e.printStackTrace();
} catch (ClassNotFoundException e) {
  e.printStackTrace();
     }

     return connection;
  }

}

如何从SQLite获取所有现有ID(编号)并将其放入组合框?

如何选择数字(ID)并将数字应用于标签?

如果我从组合框中选择任何数字

如何将带有与该号码相关联的SQLite的带有问与答的文本应用于我窗口中的textarias?

1 个答案:

答案 0 :(得分:1)

就像您的帖子中的评论一样,我强烈建议将您的代码分成几层,以提高可管理性。从您的DbConnection类开始做得很好。此外,JavaFx已经设置了一些层供您开始。

这些是:

  • 查看:您在场景生成器上创建的FXML文件
  • 控制器:FXML强制您使用的JFx控制器

现在,您可以添加更多层来管理代码。我建议从这些开始:

  • 模型:这将是您要处理的主要数据结构。对于初学者,也许您可​​以遵循数据库的结构? 示例:class Card,其中包含字段idquestionanswer
  • 持久性:该Java类将保存您的SQL代码。这也负责将ResultSet对象转换为您的 model 对象。

最后,请记住,您正在使用图层。确保他们的互动不会泄漏。

View (FXML) <--> Controller + Model <--> Persistence + Model

要回答您的问题:

  

如何从SQLite获取所有现有ID(编号)并将其放入组合框?

  1. 使用您的SQLite连接执行SQL SELECT以提取所有id。 (也许是SELECT id FROM cards?)

  2. 在成功进行SELECT调用后,迭代ResultSet对象。每次迭代都应从id列中获取数据,将其转换为字符串(或组合框接受的任何类型),然后将其全部添加。 (类似这样:comboBox.getItems().add(id)

  

如何选择数字(ID)并将数字应用于标签?

     

如何将与该号码相关的SQLite中带有问题和答案的文本应用于窗口中的textarias?

  1. 使用您的连接执行SQL SELECT,这次在语句中添加WHERE子句以过滤结果。由于现在您的SQL中包含动态部分,因此使用PreparedStatement会很好。 示例:SELECT id, question, answer FROM card WHERE id=?

  2. 使用SQL调用的结果,将它们分配给适当的JFx组件,例如标签和文本区域。