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

How to correctly connect SQLite with textfields and labels in JavaFX?

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

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

当我按下按钮 "Add" 时,会调用一个方法,并将带有问题的文本从 textaria 发送到 SQLite 中的问题选项卡,并将来自带有答案的文本的文本发送到 SQLite 中。

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

我从 window 成功发送了数据,但我不明白如何从 SQlite 获取数据并将其设置为 window

中的标签和组合框

任务控制器:

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 class:

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 的问答文本应用到我的 window 中的 textarias?

就像您在 post 中的评论一样,我强烈建议将您的代码分解成多个层以便更好地管理。从你的 DbConnection class 开始干得好。此外,JavaFx 已经为您设置了一些图层。

这些是:

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

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

  • Model:这将是您将要处理的主要数据结构。对于初学者,也许您可​​以遵循数据库的结构? 示例:class Card 具有字段 idquestionanswer
  • Persistence:此 Java class 将保存您的 SQL 代码。这也负责将 ResultSet 对象转换为您的 model 对象。

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

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

回答您的问题:

How can I get all existing ID(numbers) from SQLite and put it to combobox?

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

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

How can choose a number(ID) and apply number to a label?

How can I apply text with question and answer from SQLite connected to that number to textarias in my window?

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

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