Я пишу приложение в JavaFX с помощью Scene Builder. Моя база данных SQlite. Для просмотра и редактирования SQLite я использую DB Browser
У меня есть таблица "Карточки" и таблица "предложений" в одном файле базы данных
У меня есть кнопка «Случайный» и две текстовые арии. Когда я нажимаю на кнопку, метод вызывается. Метод берет случайный idrow из таблицы «Карты» и устанавливает текст из столбцов в textArias в моем приложении.
Я хочу получить шанс при нажатии на кнопку: 70% шанс выбрать случайного идро из таблицы «Карты» и 30% шанс выбрать случайного идро из таблицы «предложений».
Пример: если я нажму на кнопку 10 раз. Мои TextArias будут отображать текст из столбцов таблицы "Карты" - 7 раз
текст из столбцов таблицы "предложения" - 3 раза
Как выбрать случайного идроу с процентным шансом 70/30 из двух таблиц?
Класс, в котором я сохраняю запрос (этот запрос выбирает случайный idrow и предотвращает пустые строки):
package src.card;
public class PersistentQueries {
private String sqlRandom = "SELECT * FROM Cards where rowid = (ABS(RANDOM()) % (SELECT (SELECT MAX(rowid) from Cards)+1)) or rowid = (SELECT MAX(rowid) FROM Cards) ORDER BY rowid LIMIT 1";
public String getSqlRandom() {
return sqlRandom;
}
public void setSqlRandom(String sqlRandom) {
this.sqlRandom = sqlRandom;
}
}
Класс QuestionController:
@FXML private TextArea ta_questText, ta_answerText;
@FXML private Button btnRand;
Cards cards = new Cards();
PersistentQueries pq = new PersistentQueries();
ResultSet rs = null;
PreparedStatement pst = null;
@FXML void randomCard(ActionEvent event) {
try {
Connection conn = DbConnection.getConnection();
pst = conn.prepareStatement(pq.getSqlRandom());
rs = pst.executeQuery();
while (rs.next()) {
ta_questText.setText(rs.getString("question"));
ta_answerText.setText(rs.getString("answer"));
}
pst.close();
rs.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
EDIT:
Согласно ответу @MikeT я сделал специальный запрос и поместил его в один класс со всеми своими запросами:
public class PersistentQueries {
private String sqlRandomCat1 = "SELECT CASE WHEN ((abs(random()) % 10) + 1) > 7 THEN (SELECT 'category1' || rowid FROM category1 ORDER BY random() LIMIT 1) ELSE (SELECT 'sentences' || rowid FROM sentences ORDER BY random() LIMIT 1) END ";
public String getSqlRandomCat1() {
return sqlRandomCat1;
}
public void setSqlRandomCat1(String sqlRandomCat1) {
this.sqlRandomCat1 = sqlRandomCat1;
}
}
В моем QuestionController
классе я создал объект этого класса с запросами:
PersistentQueries pq = new PersistentQueries();
, а затем создал метод, который будет брать текст из столбцов в таблицах и устанавливать этот текст в текстовые области:
@FXML void randomCard(ActionEvent event) {
try {
Connection conn = DbConnection.getConnection();
pst = conn.prepareStatement(pq.getSqlRandomCat1());
rs = pst.executeQuery();
while (rs.next()) {
ta_questText.setText(rs.getString("question"));
ta_answerText.setText(rs.getString("answer"));
}
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
Я также продублировал столбцы «вопрос» и «ответ» в таблице «предложений», потому что у них не было этих столбцов. Таким образом, эти столбцы являются просто повторяющимся текстом из столбца «предложение»
Но после запуска приложения я получаю следующие ошибки:
java.sql.SQLException: no such column: 'question'
at org.sqlite.jdbc3.JDBC3ResultSet.findColumn(JDBC3ResultSet.java:48)
at org.sqlite.jdbc3.JDBC3ResultSet.getString(JDBC3ResultSet.java:443)
at src.card.QuestController.randomCard(QuestController.java:454)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
...
Есть идеи?
РЕДАКТИРОВАТЬ 2:
Что делать, если я буду использовать тот же запрос, что и раньше, чтобы сгенерировать случайного idrow из одной таблицы и создать такой метод:
генерирует случайный шанс
если шанс <70 - вызовите запрос, который возьмет строку произвольного идентификатора из таблицы «Карты» и примените текст из столбцов к моей текстовой области </p>
, если шанс> 70 и <100 - вызвать запрос, который будет извлекать случайного idrow из таблицы «предложений» и применить текст из столбцов к моей textArea </p>
Но я не знаю, как сделать этот метод.
Вы можете мне помочь?