我有一个db导入资源,我从中读取并随机设置文本到按钮和texview,代码如下:
mDbHelper.open();
Cursor c = mDbHelper.getTestData();
List<Answer> labels = new ArrayList<Answer>();
labels.add(new Answer(c.getString(2), true));
labels.add(new Answer(c.getString(3), false));
labels.add(new Answer(c.getString(4), false));
labels.add(new Answer(c.getString(5), false));
Collections.shuffle(labels);
question.setText(c.getString(1));
bOdgovor1.setText(labels.get(0).option);
bOdgovor1.setTag(labels.get(0));
bOdgovor1.setOnClickListener(clickListener);
bOdgovor2.setText(labels.get(1).option);
bOdgovor2.setTag(labels.get(1));
bOdgovor2.setOnClickListener(clickListener);
bOdgovor3.setText(labels.get(2).option);
bOdgovor3.setTag(labels.get(2));
bOdgovor3.setOnClickListener(clickListener);
bOdgovor4.setText(labels.get(3).option);
bOdgovor4.setTag(labels.get(3));
bOdgovor4.setOnClickListener(clickListener);
这是db的我的TestAdapter代码:
public Cursor getTestData()
{;
try
{
String sql ="SELECT * FROM tblPitanja ORDER BY RANDOM() LIMIT 1";
Cursor mCur = mDb.rawQuery(sql, null);
if (mCur!=null)
{
mCur.moveToNext();
}
return mCur;
}
catch (SQLException mSQLException)
{
Log.e(TAG, "getTestData >>"+ mSQLException.toString());
throw mSQLException;
}
}
在将问题设置到按钮时它非常有效,但问题重复出现。如何避免?
答案 0 :(得分:2)
有更多方法可以解决您的问题:
第二种方法可以按如下方式进行:
首先,更改你的方法和sql,包括where子句:
public Cursor getTestData(String whereClause)
{;
try
{
String sql ="SELECT * FROM tblPitanja WHERE 1 = 1 " + whereClause + " ORDER BY RANDOM() LIMIT 1";
[...]
第二,缓冲游戏类中已经回答的问题:
将LinkedList添加到您的游戏类
LinkedList<Long> mAnsweredQuestions = new LinkedList<Long>();
将已回答的问题添加到LinkedList:
Cursor c = mDbHelper.getTestData(generateWhereClause());
mAnsweredQuestions.add(c.getLong(0));
List<Answer> labels = new ArrayList<Answer>();
[...]
添加一个生成where子句的函数:
private String generateWhereClause(){
StringBuilder result = new StringBuilder();
for (Long l : mAnsweredQuestions){
result.append(" AND " + YOURID + " <> " + l);
}
return result.toString();
}
答案 1 :(得分:1)
您可以将Cursor对象保存到ArrayList中,然后使用contains来查明该问题是否已被提出。 (注意:包含使用equals方法)
public class YourClass {
java.util.ArrayList<Long> cursorList = new java.util.ArrayList<Long>();
public void YourMethod {
Cursor c = mDbHelper.getTestData();
long l = c.getLong(0);
while(cursorList.contains(l))
{
Cursor c = mDbHelper.getTestData();
l = c.getLong(0);
}
cursorList.add(l);
}
}
答案 2 :(得分:0)
对于此问题,您最好维护所询问的问题(对象或ID)列表。在向用户显示任何问题之前,检查当前问题是否在您的阵列列表中。如果当前qus在arraylist中,那么你可以调用getTestData(),否则你可以显示问题并将id或qus对象添加到数组列表中。
答案 3 :(得分:0)
解决方案取决于您的应用程序逻辑。一种可能的解决方案是从查询中删除“LIMIT 1”并加载随机排序的所有问题。
如果您的应用程序执行类似“向我显示以前从未见过的随机问题”的内容,则必须保留已访问过的问题列表(在内存中或在数据库中 - 再次取决于您的应用程序逻辑。对于数据库解决方案就像将访问列添加到您的数据库一样简单。