2

アセットにインポートされたデータベースがあり、そこから読み取り、テキストをボタンと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;
         }
     }

ボタンに質問を設定する場合は完全に機能しますが、質問は繰り返されます。それを回避する方法は?

4

4 に答える 4

2

問題を解決するためのより多くのアプローチがあります:

  1. 最初にsql-statement(制限なし)を実行し、質問に正しく答えられたらカーソルの次のエントリに移動します
  2. すでに回答した質問をバッファリングする

2番目のアプローチは次のように実行できます。

まず、where句を含めてメソッドとSQLを変更します。

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-clauseを生成する関数を追加します。

private String generateWhereClause(){
    StringBuilder result = new StringBuilder();
    for (Long l : mAnsweredQuestions){
         result.append(" AND " + YOURID + " <> " + l);
    }
    return result.toString();
}
于 2013-03-03T12:35:35.967 に答える
1

CursorオブジェクトをArrayListに保存し、containsを使用して、その質問がすでに質問されているかどうかを確認できます。(注: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);

    }
}
于 2013-03-03T12:51:47.023 に答える
0

この問題については、質問のリスト(オブジェクトまたはID)を維持することをお勧めします。ユーザーに質問を表示する前に、現在の質問が配列リストにあるかどうかを確認してください。現在のqusがarraylistにある場合は、getTestData()を呼び出すことができます。そうでない場合は、質問を表示して、idまたはqusオブジェクトを配列リストに追加できます。

于 2013-03-03T12:30:13.297 に答える
0

解決策は、アプリケーションロジックによって異なります。考えられる解決策の1つは、クエリから「LIMIT 1」を削除し、ランダムに並べ替えられたすべての質問を読み込むことです。

アプリが「これまでに見たことのない次のランダムな質問を表示する」などの処理を行う場合は、既にアクセスした質問のリストを保持する必要があります(メモリ内またはDB内-アプリケーションロジックによって異なります。DBソリューションの場合も同様です)。訪問した列をデータベースに追加します。

于 2013-03-03T12:31:03.143 に答える