如何从Android Studio中的数据库中选择的随机行列表中显示正确的行?

时间:2016-10-22 19:58:29

标签: android sqlite android-studio android-sqlite android-database

我正在Android应用中制作测验部分。我创建了一个数据库,并使程序从表中选择随机行(问题)。然后在实际测验中显示这些随机问题,之后用户可以看到他回答哪些问题是对错。问题是在显示正确答案的活动中,问题与测验中的问题完全不同。他们似乎也以某种方式随机化。

这是Database类的摘录:

// Table Columns names
private static final String KEY_ID = "id";
private static final String KEY_QUESTION = "question";
private static final String KEY_ANSWER = "answer"; //correct option
private static final String KEY_OPTA = "opta"; //option a
private static final String KEY_OPTB = "optb"; //option b
private static final String KEY_OPTC = "optc"; //option c
private static final String KEY_OPTD = "optd"; //option d

private SQLiteDatabase myDatabase;

public SQLDatabaseT1(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db1) {

    myDatabase=db1;

    // A new table is created if there is none
    String sql = "CREATE TABLE IF NOT EXISTS " + TABLE_QUESTION + " ( "
            + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_QUESTION
            + " TEXT, " + KEY_ANSWER + " TEXT, "+ KEY_OPTA +" TEXT, "
            + KEY_OPTB +" TEXT, "+ KEY_OPTC +" TEXT, " + KEY_OPTD + " TEXT)";

    db1.execSQL(sql);

    // Adds questions from this method below
    addQuestions1();
}

@Override
public void onUpgrade(SQLiteDatabase db1, int oldV, int newV) {

    // Drop older table if existed
    db1.execSQL("DROP TABLE IF EXISTS " + TABLE_QUESTION);

    // Creates tables again
    onCreate(db1);
}

// Takes 7 random rows from the table and puts into the topic quiz
public Cursor getRandomDataItemFromDb(String TABLE_QUESTION, String limit) {
    SQLiteDatabase db1 = this.getWritableDatabase();
    Cursor cursor = db1.rawQuery("SELECT * FROM " + TABLE_QUESTION + " ORDER BY RANDOM() LIMIT 7", null);
    if (cursor.moveToFirst()) {
        return cursor;
    }
    return cursor;
}

// Sets the limit of how many questions will be in the quiz
public int rowCount()
{
    int row=7; //There will be 7 questions in a quiz
    return row;
}

public List<Question> getAllQuestions() {

    List<Question> quesList = new ArrayList<Question>();

    String selectQuery = "SELECT * FROM " + TABLE_QUESTION + " ORDER BY RANDOM() LIMIT 7";

    myDatabase=this.getReadableDatabase();

    Cursor cursor = myDatabase.rawQuery(selectQuery, null);

    if (cursor.moveToFirst()) {
        do {
            Question quest = new Question();
            quest.setId(cursor.getInt(0));
            quest.setQUESTION(cursor.getString(1));
            quest.setANSWER(cursor.getString(2));
            quest.setOptionA(cursor.getString(3));
            quest.setOptionB(cursor.getString(4));
            quest.setOptionC(cursor.getString(5));
            quest.setOptionD(cursor.getString(6));

            quesList.add(quest);

        } while (cursor.moveToNext());
    }
    // returns question list
    return quesList;
}

这是显示问题列表的类,显示正确的答案和用户的答案:

public class QuizViewAnswers1 extends AppCompatActivity {

private ListView listofAnswers;

private List<Question> questionsList;
private Question currentQuestion;

ArrayList<HashMap<String, Object>> originalValues = new ArrayList<HashMap<String, Object>>();

HashMap<String, Object> temp = new HashMap<String, Object>();

public static String KEY_QUESTION = "questions";
public static String KEY_CANS = "canswer";
public static String KEY_YANS = "yanswer";

private CustomAdapter adapter;

ArrayList<String> myAnsList = new ArrayList<String>();

Button homeQuiz;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.quiz_show_ans);
    String selectQuery;
    Intent in = getIntent();
    Bundle b = getIntent().getExtras();
    myAnsList=in.getExtras().getStringArrayList("myAnsList");

    listofAnswers=(ListView)findViewById(R.id.listofAnswers);

    //Initialize the database
    final SQLDatabaseT1 sqldb = new SQLDatabaseT1(this);
    questionsList= sqldb.getAllQuestions();


    for (int i = 0; i < 7; i++) {
        currentQuestion = questionsList.get(i);
        temp = new HashMap<String, Object>();
        temp.put(KEY_QUESTION,  currentQuestion.getQUESTION());
        temp.put(KEY_CANS, currentQuestion.getANSWER());
        temp.put(KEY_YANS, myAnsList.get(i));

        // add the row to the ArrayList
        originalValues.add(temp);

    }

    adapter = new CustomAdapter(QuizViewAnswers1.this, R.layout.ans_list, originalValues);
    listofAnswers.setAdapter(adapter);

    homeQuiz = (Button) findViewById(R.id.quizHome);
    homeQuiz.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(QuizViewAnswers1.this, Quiz.class);
            startActivity(intent);
            finish();
        }
    });
}

// define your custom adapter
private class CustomAdapter extends ArrayAdapter<HashMap<String, Object>> {
    LayoutInflater inflater;

    public CustomAdapter(Context context, int textViewResourceId, ArrayList<HashMap<String, Object>> Strings) {
        super(context, textViewResourceId, Strings);
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    // class for caching the views in a row
    private class ViewHolder {

        TextView viewQuestions, viewAnswers, yourAnswers;

    }

    ViewHolder viewHolder;

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if (convertView == null) {

            convertView = inflater.inflate(R.layout.ans_list, null);
            viewHolder = new ViewHolder();

            viewHolder.viewQuestions = (TextView) convertView.findViewById(R.id.question);

            viewHolder.viewAnswers = (TextView) convertView
                    .findViewById(R.id.correctanswer);
            viewHolder.yourAnswers = (TextView) convertView
                    .findViewById(R.id.useranswer);

            // link the cached views to the convertview
            convertView.setTag(viewHolder);

        } else
            viewHolder = (ViewHolder) convertView.getTag();

        viewHolder.viewQuestions.setText(originalValues.get(position).get(KEY_QUESTION)
                .toString());

        viewHolder.viewAnswers.setText("Correct Answer: " + originalValues.get(position).get(KEY_CANS)
                .toString());
        viewHolder.yourAnswers.setText("Your Answer: " + originalValues.get(position)
                .get(KEY_YANS).toString());

        // return the view to be displayed
        return convertView;
    }
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        // Respond to the action bar's Up/Home button
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
    }
    return super.onOptionsItemSelected(item);
}

}

图片显示的示例中的问题与“正确答案”列表完全不同。唯一剩下的就是用户做出的回答。 Question Answers list

我应该在QuizViewAnswers1类中更改什么?提前致谢。

1 个答案:

答案 0 :(得分:0)

问题是你是用sqldb.getAllQuestions()再次提问,然后再将它们随机化。

这样做的方法是使用您提取的相同数据集来提问。只需将其存储在一些常见位置(也可以是单例类),然后从测验活动和结果活动中访问它。

相关问题