Выбор строк из базы данных sqlite иногда показывает одну и ту же строку

Я делаю несколько тестов приложение с базой данных sqlite.

Я произвольно выбираю 5 строк, используя "ORDER BY RANDOM()" в rawquery, но одна и та же строка иногда появляется в строке.

Он показывает 5 разных строк в некоторых случаях. Случайный выбор также работает правильно, так что мой запрос, кажется, работает правильно.

Я просто не могу выяснить, в каком случае он показывает тот же вопрос и варианты подряд. У кого-нибудь есть такая же проблема, как у меня??

Вот мой код

public class QuizActivity extends Activity implements OnClickListener {

    int Correct = 0;
    int Cnt = 1;

    String fieldinfo;
    String question;
    String answer;
    String choice1;
    String choice2;

    private MySQLHelper mDbHelper;  
    private SQLiteDatabase db; 
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_quiz);
        onQuestion();
    }

    public void onQuestion(){
        mDbHelper = new MySQLHelper(this);
        db = mDbHelper.getWritableDatabase();  
        try{           
            Cursor c = db.rawQuery("SELECT field, question, choice1, choice2, answer FROM WineQuiz ORDER BY RANDOM() LIMIT 5", null);
            if(c.moveToFirst());
            {
            while(c.moveToNext()){
                fieldinfo = c.getString(c.getColumnIndex("field"));
                question = c.getString(c.getColumnIndex("question"));
                choice1 = c.getString(c.getColumnIndex("choice1"));
                choice2 = c.getString(c.getColumnIndex("choice2"));
                answer = c.getString(c.getColumnIndex("answer"));   
            };
            }
        }catch(Exception e){
            System.out.println("");;
        }finally{
            db.close();
        }        
            ImageView image3 = (ImageView) findViewById(R.id.imageChoice1);
            ImageView image4 = (ImageView) findViewById(R.id.imageChoice2);
            TextView textChoice1 = (TextView) findViewById(R.id.textChoice1);
            textChoice1.setText(choice1);
            TextView textChoice2 = (TextView) findViewById(R.id.textChoice2);
            textChoice2.setText(choice2);
            image3.setOnClickListener(this);
            image4.setOnClickListener(this);
    }

    public void onClick(View v){

        switch(v.getId()){
        case R.id.imageChoice1:
            if(answer.equals(choice1)){
                Correct++;
                Toast.makeText(this, "Correct", Toast.LENGTH_SHORT ).show();
            }else{
                Toast.makeText(this, "Incorrect", Toast.LENGTH_SHORT ).show();
            }
            break;
        case R.id.imageChoice2:
            if(choice2.equals(answer)){
                Correct++;
                Toast.makeText(this, "Correct", Toast.LENGTH_SHORT ).show();
            }else{
                Toast.makeText(this, "Incorrect", Toast.LENGTH_SHORT ).show();
            }
            break;
         }

        if(Cnt==5){
            Intent intent = new Intent(this, ResultActivity.class);
            intent.putExtra("Correct", Correct );
            startActivity(intent);
        }else{
            Cnt++;
            onQuestion();
        }
    }

}

1 ответ

Решение

rawQuery call возвращает курсор с пятью вопросами, но следующий цикл перезаписывает переменные (fieldinfo и т. д.) в каждой итерации цикла, так что вы получите только значения последней из пяти строк. (И первый ряд пропускается, потому что вы звоните moveToNext после того как вы перешли в первый ряд.)

Запрос не гарантированно возвращает те же пять строк всякий раз, когда onQuestion называется, так что вы в конечном итоге каждый раз получаете несколько случайных строк.

Сначала вы должны прочитать все пять вопросов (в массив или что-то в этом роде), а затем показать их один за другим, не обращаясь к базе данных снова.

Другие вопросы по тегам