慢加载测验

时间:2016-05-10 14:16:16

标签: database sqlite

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;
        }


    }

0 个答案:

没有答案