Как правильно связать SQLite с текстовыми полями и метками в JavaFX? - PullRequest
0 голосов
/ 02 января 2019

Я делаю приложение с помощью JavaFX, Scene Builder и SQLite.Для управления базой данных SQLite я использую DB Browser

У меня есть 3 поля в SQLite: ID, вопрос, ответ

Когда я нажимаю кнопку «Добавить», вызывается метод и отправляется текст сtextaria с вкладкой «вопрос-вопрос» в SQLite и текст из textaria с ответом делают то же самое.

Идентификатор - это число, которое автоматически добавляется при добавлении этих полей в 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();
    }

  }
}

DbСоединение класса:

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 и поместить их в выпадающий список?

Как выбрать номер (идентификатор) и применить номер к метке?

если я выберу любое число из выпадающего списка

Как применить текст с вопросом и ответом из SQLite, подключенного кЧто такое текстовые номера в моем окне?

1 Ответ

0 голосов
/ 02 января 2019

Как и комментарии в вашем посте, я настоятельно рекомендую разбивать ваши коды на слои для лучшей управляемости. Хорошая работа, чтобы начать с вашего DbConnection класса. Кроме того, JavaFx уже настроил некоторый слой, чтобы вы могли его начать.

Это:

  • Просмотр : ваш файл FXML, созданный в конструкторе сцен
  • Контроллер : контроллер JFx, который FXML заставляет вас использовать

Теперь вам нужно добавить больше слоев для управления вашим кодом. Я предлагаю начать с этих:

  • Модель : это будет основная структура данных, с которой вы будете работать. Для начала, может быть, вы можете следить за структурой вашей базы данных? Пример: class Card с полями id, question и answer.
  • Постоянство : этот класс Java будет содержать ваш код SQL. Это также отвечает за преобразование объекта ResultSet в объект модель .

Тогда, наконец, имейте в виду, что вы работаете со слоями. Убедитесь, что их взаимодействия не протекают.

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

Чтобы ответить на ваши вопросы:

Как я могу получить все существующие идентификаторы (номера) из SQLite и поместить их в комбинированный список?

  1. Выполните SQL SELECT, используя ваше соединение SQLite, чтобы получить все id s. (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, таким как метки и текстовые области.

...