Java 如何从SQLite中随机设置按钮的文本而不重复?

Java 如何从SQLite中随机设置按钮的文本而不重复?,java,android,android-sqlite,Java,Android,Android Sqlite,我将一个db导入到资产中,从中读取并随机将文本设置为按钮和texview,代码如下: mDbHelper.open(); Cursor c = mDbHelper.getTestData(); List<Answer> labels = new ArrayList<Answer>(); labels.add(new Answer(c.getString(2), true));

我将一个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);

当涉及到将问题设置为按钮时,它非常有效,但问题会重复。如何避免这种情况?

对于这个问题,最好维护您所问问题(对象或id)的列表。在向用户显示任何问题之前,请检查当前问题是否在数组列表中。如果当前qus位于arraylist中,则可以调用getTestData(),否则可以显示问题并将id或qus对象添加到数组列表中。

解决方案取决于应用程序逻辑。一个可能的解决方案是从查询中删除“限制1”,并加载所有随机排序的问题


如果你的应用程序执行“向我显示下一个我从未见过的随机问题”之类的操作,你必须保留已访问问题的列表(在内存中,或在DB中-同样取决于你的应用程序逻辑。因为DB解决方案非常简单,只需将访问列添加到数据库中即可。

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

  • 在开始处执行sql语句(不限制),并在正确回答问题时移动到光标的下一个条目
  • 把已经回答的问题放在哪里
  • 第二种方法可以如下所示:

    首先,更改方法和sql,包括where子句:

    public Cursor getTestData(String whereClause)
     {;
         try
         {
             String sql ="SELECT * FROM tblPitanja WHERE 1 = 1 " + whereClause + " ORDER BY RANDOM() LIMIT 1";
             [...]
    
    private String generateWhereClause(){
        StringBuilder result = new StringBuilder();
        for (Long l : mAnsweredQuestions){
             result.append(" AND " + YOURID + " <> " + l);
        }
        return result.toString();
    }
    
    第二,在游戏类中缓冲已回答的问题:

    将LinkedList添加到游戏类

    LinkedList<Long> mAnsweredQuestions = new LinkedList<Long>();
    
    LinkedList mAnsweredQuestions=new LinkedList();
    
    将已回答的问题添加到LinkedList:

    Cursor c = mDbHelper.getTestData(generateWhereClause());
    mAnsweredQuestions.add(c.getLong(0));
    List<Answer> labels = new ArrayList<Answer>();
    [...]
    
    光标c=mDbHelper.getTestData(generateWhereClause()); 添加(c.getLong(0)); 列表标签=新的ArrayList(); [...] 添加生成where子句的函数:

    public Cursor getTestData(String whereClause)
     {;
         try
         {
             String sql ="SELECT * FROM tblPitanja WHERE 1 = 1 " + whereClause + " ORDER BY RANDOM() LIMIT 1";
             [...]
    
    private String generateWhereClause(){
        StringBuilder result = new StringBuilder();
        for (Long l : mAnsweredQuestions){
             result.append(" AND " + YOURID + " <> " + l);
        }
        return result.toString();
    }
    
    private String generateWhere子句(){
    StringBuilder结果=新建StringBuilder();
    用于(长l:mAnsweredQuestions){
    result.append(“AND”+YOURID+“”+l);
    }
    返回result.toString();
    }
    
    您只需将光标对象保存到ArrayList中,然后使用contains来确定该问题是否已被提出。(注意:contains使用equals方法)

    公共类您的类{
    java.util.ArrayList cursorList=新java.util.ArrayList();
    公共方法{
    游标c=mDbHelper.getTestData();
    长l=c.getLong(0);
    while(游标列表包含(l))
    {
    游标c=mDbHelper.getTestData();
    l=c.getLong(0);
    }
    加上(l);
    }
    }
    
    您是否多次调用此函数?我得到了c的重复变量。您能用一个例子解释一下吗?我表格中的这个+YOURID+part?ID行名为_ID,如果有帮助的话。然后将该部分更改为result.append(“AND _ID”+l);