Can't fetch data from SQLite database in AS

Advertisements

I’m creating a Quiz app in Android Studio, and so I created a Database that contains the questions. In the helper class I have a method getAllQuestions that transfers the questions from the database to an array list, so then I can extract the Questions in Main and setText in Buttons. However, while I run my app the buttons and the Question are empty, without the app throwing exceptions like nullpointer if the list itself was empty.
The Screenshot

DB_Helper methods:

private void addQuestions(QuestionsDataBase Questions)
{

    ContentValues cv =  new ContentValues();
    cv.put(QuestionTable.Column_Question,Questions.getQuestion());
    cv.put(QuestionTable.Column_Option1,Questions.getOption1());
    cv.put(QuestionTable.Column_Option2,Questions.getOption2());
    cv.put(QuestionTable.Column_Option3,Questions.getOption3());
    cv.put(QuestionTable.Column_Option4,Questions.getOption4());
    cv.put(QuestionTable.Column_Correct_Ans,Questions.getQuestion());
    db.insert(QuestionTable.Table_Name,null,cv);
}

public ArrayList getAllQuestions(){

    ArrayList<QuestionsDataBase> questionsList = new ArrayList<>();
    db = getReadableDatabase();
    String[] Projection ={
            QuestionTable._ID,
            QuestionTable.Column_Question,
            QuestionTable.Column_Option1,
            QuestionTable.Column_Option2,
            QuestionTable.Column_Option3,
            QuestionTable.Column_Option4,
            QuestionTable.Column_Correct_Ans
    };
    Cursor c = db.query(QuestionTable.Table_Name,
            Projection,
            null,
            null,
            null,
            null,
            null);
    if(c.moveToFirst()){
        do{
            QuestionsDataBase questions = new QuestionsDataBase();
            questions.setQuestion(c.getString(c.getColumnIndexOrThrow(QuestionTable.Column_Question)));
            questions.setOption1(c.getString(c.getColumnIndexOrThrow(QuestionTable.Column_Option1)));
            questions.setOption2(c.getString(c.getColumnIndexOrThrow(QuestionTable.Column_Option2)));
            questions.setOption3(c.getString(c.getColumnIndexOrThrow(QuestionTable.Column_Option3)));
            questions.setOption4(c.getString(c.getColumnIndexOrThrow(QuestionTable.Column_Option4)));
            questions.setCorrectAns(c.getInt(c.getColumnIndexOrThrow(QuestionTable.Column_Correct_Ans)));
            questionsList.add(questions);
            questionsList.add(questions);

        }while(c.moveToNext());
    }
    c.close();
    return questionsList;
}

Methods in MainActivity:

private void fecthDB(){

    DB_Helper db = new DB_Helper(this);
    questionList = db.getAllQuestions();
    startQuiz();
}

private void startQuiz()
{

    questionTotalCount = questionList.size(); // the total amount of questions in the current quizactivity( is set to 10)
    Collections.shuffle(questionList); // shuffle the questions form the database that are stored in QuestionList
    showQuestions();

    nextbutton.setOnClickListener(view -> {
        if(!answered){
            if(option1.isChecked() || option2.isChecked() || option3.isChecked() || option4.isChecked())
                QuizOperations();
        }
    });

}

private void showQuestions() // Showing the question and the options from database
{

    rbGroup.clearCheck();
    if(questionCounter< questionTotalCount) // if not all the questions yet answered set text to new questions
    {
        currentQuestions = questionList.get(questionCounter);
        questionCount.setText(currentQuestions.getQuestion());
        option1.setText(currentQuestions.getOption1());
        option2.setText(currentQuestions.getOption2());
        option3.setText(currentQuestions.getOption3());
        option4.setText(currentQuestions.getOption4());

        questionCounter ++; // +1 to question counter
        answered = false; // tye quiz is not yet completely answered while the current question is smaller then total
        nextbutton.setText("Next");

        questionCount.setText("Questions: " + questionCounter + "/" + questionTotalCount); // how many questions answered out of 10
    }
    else{// if all the questions are answered
        handler.postDelayed(() -> {
            Intent intent = new Intent(getApplicationContext(),QuizActivity.class); // open the next activity

        }, 500); // wait for a half second
    }
}

>Solution :

I believe you want to set other fields on your QuestionsDataBase object here rather than setQuestion() for each column in the database query:

            questions.setQuestion(c.getString(c.getColumnIndexOrThrow(QuestionTable.Column_Option1)));
            questions.setQuestion(c.getString(c.getColumnIndexOrThrow(QuestionTable.Column_Option2)));
            questions.setQuestion(c.getString(c.getColumnIndexOrThrow(QuestionTable.Column_Option3)));
            questions.setQuestion(c.getString(c.getColumnIndexOrThrow(QuestionTable.Column_Option4)));
            questions.setQuestion(c.getString(c.getColumnIndexOrThrow(QuestionTable.Column_Correct_Ans)));

Thanks, edited it. Now it shows the options, but doesn’t show the question itself.

You are setting text to questionCount twice where the later overwrites the first one. Maybe the first one should set the question textview instead.

Leave a ReplyCancel reply