您好我目前有一个数据库,其中存储了5个问题和答案。我希望每次应用程序运行时随机输出三个问题。我有以下代码,但我的应用程序在加载时崩溃
public List<Question> getAllQuestions() {
List<Question> quesList = new ArrayList<Question>();
int nQuestions = 3; //select COUNT(*) from questions
Random random = new Random();
int id = random.nextInt(nQuestions);
String selectQuery = "SELECT id FROM " + TABLE_QUEST;
dbase=this.getReadableDatabase();
Cursor cursor = dbase.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
Question quest = new Question();
quest.setID(cursor.getInt(0));
quest.setQUESTION(cursor.getString(1));
quest.setANSWER(cursor.getString(2));
quest.setOPTA(cursor.getString(3));
quest.setOPTB(cursor.getString(4));
quest.setOPTC(cursor.getString(5));
quesList.add(quest);
} while (cursor.moveToNext());{
id = random.nextInt(nQuestions);
}
}
// return quest list
return quesList;
}
答案 0 :(得分:1)
很抱歉,我写这个作为答案,但我没有权限为一个问题写评论,所以我想告诉你,首先你将永远成为前三个增加的问题之一一个随机问题,因为对于随机ID,您使用3 id = random.nextInt(nQuestions);
代替nQuestions
而不是questList.size()
(对于您来说是3,您应该使用{{1}}并对其中的数字执行3次0到questList.size()
答案 1 :(得分:0)
问题是,您只能从表中选择所有条目的ID。
您的随机内容也会只选择问题0,1或2.您的随机内容应为random.nextInt(5)
,因为您有5个问题。
最后,这应该是一个循环,然后在您的查询中添加多个轮询以获得多个问题。
String query = "SELECT * FROM " + TABLE_QUEST + " WHERE ";
for (int x = 0; x < nQuestions; x++) {
if (x > 0) {
query += " OR ";
}
query += "id=" + random.nextInt(5);
}
这将使您的查询如下所示:
SELECT * FROM TABLE_QUEST WHERE id=4 OR id=2 OR id=3
最后,改变你的cursor.moveToNext()的方式。您的代码应如下所示:
public List<Question> getAllQuestions() {
List<Question> quesList = new ArrayList<Question>();
int nQuestions = 3; //select COUNT(*) from questions
Random random = new Random();
String query = "SELECT * FROM " + TABLE_QUEST + " WHERE ";
for (int x = 0; x < nQuestions; x++) {
if (x > 0) {
query += " OR ";
}
query += "id=" + random.nextInt(5);
}
dbase=this.getReadableDatabase();
Cursor cursor = dbase.rawQuery(query, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
Question quest = new Question();
quest.setID(cursor.getInt(0));
quest.setQUESTION(cursor.getString(1));
quest.setANSWER(cursor.getString(2));
quest.setOPTA(cursor.getString(3));
quest.setOPTB(cursor.getString(4));
quest.setOPTC(cursor.getString(5));
quesList.add(quest);
} while (cursor.moveToNext());
}
// return quest list
return quesList;
}
答案 2 :(得分:0)
您的代码中存在一些错误。
首先,您的SQL查询错误:
String selectQuery = "SELECT id FROM " + TABLE_QUEST;
为您提供表TABLE_QUEST中“id”列的所有值,而不是您通过调用Random.nextInt确定的id
列。
String selectQuery = "SELECT * FROM " + TABLE_QUEST + " WHERE id=" + id;
“*”代表“此表中的所有列”,“WHERE”允许您根据后面的条件过滤行(即id = 3)。
注意虽然在这种情况下不是问题,但是传递未转义的值(即WHERE id=" + id
部分是非常糟糕的形式,因为一旦您使用用户输入,它可能会使您容易受到SQL注入攻击这一点)。
第二:由于各种原因,其余代码没有多大意义。我会尝试列出一些:
我会改写整个方法;有几种方法可以做到这一点。只是一些提示:
listB.size() < 3
),就从列表A中删除一个随机元素并将其添加到列表B中。有无数其他方法可以实现您的目标。但我只是使用ORDER BY RANDOM() LIMIT x
技巧,这可能是最简单的方法。