java - 如何从 SQLite 随机设置文本到按钮而不重复?

标签 java android android-sqlite

我有一个导入到 Assets 中的数据库,我从中读取并随机将文本设置为按钮和 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);

这是我的数据库 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;
         }
     }

在向按钮设置问题时效果很好,但问题会重复。如何避免这种情况?

最佳答案

还有更多方法可以解决您的问题:

  1. 在开头执行sql语句(无限制),并在正确回答问题时移动到光标的下一个条目
  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();
}

关于java - 如何从 SQLite 随机设置文本到按钮而不重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15185495/

相关文章:

java - 通过 Java 套接字接收混合媒体。你的更好吗?

java - 需要帮助来实现从 Java 应用程序拖放到 native 文件系统

java - Intellij14.1错误:No main class for module

Android AudioTrack 不播放所有样本

android - 如何将预建的 Android SQLite 数据库移动到内存?

java - 将 BMI 存储在 SQLite 中

java - 从 Arraylist 创建字符串数组

android - 使用 Canvas 绘制时分别更改文本高度和宽度

android - 通过具有自动解析功能的 Android 应用程序在 Facebook 上分享链接

android - Room Dao 返回插入 ID,但数据库中缺少数据