1
我在我的Android应用程序中进行测验。我创建了一个数据库,并且创建了它,程序从表中选择了随机行(问题)。然后,这些随机问题将显示在实际测验中,然后用户可以看到他回答对对错的问题。问题是,在显示正确答案的活动中,问题与测验中的问题完全不同。他们似乎也以某种方式随机化。如何从Android Studio中的数据库中选择的随机行列表中显示正确的行?
这是从数据库类的提取物:
// 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类中更改什么?提前致谢。
嗨zon7,谢谢你的回复。有什么办法可以改变那部分代码而不是制作一个单独的类: –
final SQLDatabaseT1 sqldb = new SQLDatabaseT1(this); questionsList = sqldb.getAllQuestions(); ? –
如果你想从两个活动没有问题可以访问的问题。是一个单身人士或在其中一个使用静态变量来存储问题。添加其他课程有什么问题? – zon7