В коде есть пара ошибок.
Во-первых, ваш SQL-запрос неправильно:
String selectQuery = "SELECT id FROM " + TABLE_QUEST;
дает все значения столбца «ID» в таблице TABLE_QUEST, а не столбец с id
вы определили с вашим вызовом Random.nextInt ,
String selectQuery = "SELECT * FROM " + TABLE_QUEST + " WHERE id=" + id;
Символ «*» означает «все столбцы в этой таблице» и «WHERE» позволяет фильтровать строки в соответствии с условиями, которые следуют (т.е. идентификатор = 3).
Примечание в то время как это не является проблемой в этом случае, переходя неэкранированные значения (т.е. WHERE id=" + id
часть очень плохой форме, потому что это может сделать вас уязвимыми для инъекций SQL, как только вы используете пользовательский ввод для этого).
Второй: остальная часть кода не имеет большого смысла по разным причинам. Я попытаюсь перечислить некоторые из них:
- если ваш код будет работать (т.е. с * вместо идентификатора в SELECT, но без предложения WHERE), вы бы просто добавить все вопросы в базе данных к списку, потому что нет никаких условий.
- Если условие будет работать, вы получите только одну строку с определенным идентификатором. ваш цикл while-while будет работать только один раз.
- Если у вас был цикл вокруг выбора, тогда он может работать, но он, вероятно, вернет те же строки TWICE или даже чаще.
- вы все равно получите случайные сбои по разным причинам, среди них
- первичных ключей - атрибут ID, который, вероятно, автоинкрементный - это не обязательно в пределах 0..n-1. это может быть в вашем случае, но это не совсем типично. автоматически увеличивающиеся первичные ключи обычно начинаются с 1.
- , если ваши ответы на вопросники CRUD (создание, чтение, обновление, удаление), идентификаторы могут иметь отверстия, то есть «1, 2, 6, 8, 12».
я бы переписать весь метод; есть несколько способов сделать это. лишь несколько советов:
- если есть очень мало записей в таблице (например, менее чем за пару сотен), вы можете просто загрузить все вопросы в список А.
- списка Создать
- надстройку все записи из базы данных перечислить
- создать список B
- до тех пор, как есть в списке B меньше элементов, чем вы хотите (т.е.
listB.size() < 3
) удалить произвольный элемент из списка а и добавить его в список Б.
- return listB. // Это кажется расточительным, но, вероятно, будет в порядке.
- пусть базы данных делать рандомизации:
- SELECT * FROM таблицы ORDER BY RANDOM() LIMIT 3;
- прочитать все записи в список
- вернуть список
- сделано! (примечание: это работает с sqlite, но, насколько мне известно, не универсально принято различными системами баз данных).
есть множество других способов достижения этой цели. но я бы просто использовал трюк ORDER BY RANDOM() LIMIT x
, это, наверное, самый простой способ.
Вы видите какие-либо исключения, когда приложение выходит из строя? Содержит ли код? – CKing