Helli!我遇到了数据库问题。我自己是一个没有经验的程序员,我请求你的帮助。当我运行游戏测验游戏加载很长时间,也就是长期问题数据库。这里是数据库结构:
DROP TABLE IF EXISTS QUESTION;
DROP TABLE IF EXISTS ANSWER;
CREATE TABLE ANSWER (id_answer INTEGER PRIMARY KEY, id_question NUMERIC, answer_text TEXT, correct NUMERIC);
INSERT INTO ANSWER VALUES(1,1,'Murmillo',0);
INSERT INTO ANSWER VALUES(2,1,'Retiarius',0);
INSERT INTO ANSWER VALUES(3,1,'Rudiarius',1);
INSERT INTO ANSWER VALUES(4,1,'Secutor',0);
INSERT INTO ANSWER VALUES(5,2,'Augustus',0);
INSERT INTO ANSWER VALUES(6,2,'Caligula',0);
INSERT INTO ANSWER VALUES(7,2,'Caracalla',0);
INSERT INTO ANSWER VALUES(8,2,'Felix',1);
.......
CREATE TABLE QUESTION (id_question INTEGER PRIMARY KEY, text TEXT, difficulty NUMERIC, topic TEXT);
INSERT INTO QUESTION VALUES(1,'How were the gladiators in ancient Rome, who earned freedom but decided to remain gladiators, called? ',10,'history');
INSERT INTO QUESTION VALUES(2,'Which agnomen did Lucius Cornelius Sulla acquire?',7,'history');
Class DataBaseHelper代码:
package db;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper {
private static int DB_VERSION = 1;
private static String DB_NAME = "quiz";
//tables' variables descriptions
public static final String TABLE_QUESTION = "Question";
public static final String TABLE_ANSWER = "Answer";
public boolean _should_fill = false;
private SQLiteDatabase myDataBase;
public boolean shouldFill(){
return _should_fill;
}
private DatabaseHelper(Context context){
super(context, DB_NAME, null, (DB_VERSION+1));
}
private static DatabaseHelper instance = null;
public static DatabaseHelper getInstance(Context context)
{
if (instance == null)
instance = new DatabaseHelper(context);
return instance;
}
public void setDataBase(SQLiteDatabase db)
{
myDataBase = db;
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
_should_fill = true;
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
sqLiteDatabase.execSQL("DROP TABLE IF EXISTS "+ TABLE_QUESTION);
sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_ANSWER);
onCreate(sqLiteDatabase);
}
// TODO: select a question randomly
// hint: SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
// more TODO: retrieve a question which id is not equal to a specified id
public TestQuestion getQuestionWithAnswers(String topic, long quest_number, long curQuestId)
{
//quest_number is the number of the question or difficulty(in db)
//first we will select the important question
Cursor cursor = null;
if (curQuestId == -1)
{
if (topic != null)
cursor = myDataBase.rawQuery(
"SELECT * FROM Question WHERE difficulty=? AND topic=? ORDER BY RANDOM() LIMIT 1",
new String[] { String.valueOf(quest_number), topic });
else
cursor = myDataBase.rawQuery(
"SELECT * FROM Question WHERE difficulty=? ORDER BY RANDOM() LIMIT 1",
new String[] { String.valueOf(quest_number)});
cursor.moveToFirst();
}
else
{
if (topic != null)
cursor = myDataBase.rawQuery(
"SELECT * FROM Question WHERE difficulty=? AND topic=? ORDER BY RANDOM()",
new String[] { String.valueOf(quest_number), topic });
else
cursor = myDataBase.rawQuery(
"SELECT * FROM Question WHERE difficulty=? ORDER BY RANDOM()",
new String[] { String.valueOf(quest_number)});
cursor.moveToFirst();
long qId = cursor.getLong(cursor.getColumnIndex("id_question"));
while (curQuestId == qId)
{
if (cursor.moveToNext())
qId = cursor.getLong(cursor.getColumnIndex("id_question"));
else
{
cursor.moveToFirst();
break;
}
}
}
//let's get the selected question
Question question = new Question(
cursor.getLong(cursor.getColumnIndex("id_question")),
cursor.getString(cursor.getColumnIndex("text")),
quest_number,
cursor.getString(cursor.getColumnIndex("topic"))
);
System.out.println(question.getText()+" ; "+question.get_difficulty());
//this is the id of the question
long id = cursor.getLong(cursor.getColumnIndex("id_question"));
cursor.close();
//let's select the answers for this question
Cursor curs = myDataBase.rawQuery(
"SELECT * FROM Answer WHERE id_question=?",
new String[] { String.valueOf(id) }
);
Answer[] answers = new Answer[4];
if(curs != null){
if (curs.moveToFirst()){
int i = 0;
do{
answers[i++] = new Answer(
curs.getLong(curs.getColumnIndex("id_answer")),
curs.getString(curs.getColumnIndex("answer_text")),
id,
curs.getLong(curs.getColumnIndex("correct"))
);
} while(curs.moveToNext());
}
};
LinkedHashMap<Question, ArrayList<Answer>>();
TestQuestion tQuestion = new TestQuestion(question,answers);
return tQuestion;
}
}