从多维数组中获取值太慢

时间:2015-06-10 14:26:33

标签: java android arrays performance sqlite

美好的一天, 我一直在研究一个Android项目的更新,并遇到了一个问题。我必须从SQLite数据库中读取问题,我已成功将其加载到多维数组中,如下面的数据库助手类所示:

public String getSome(int s,int t, String Table_Name){

        String selectQuery = "SELECT  * FROM " + Table_Name;
              SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);
        int rows = cursor.getCount();
        int num=0;
        int col = 0;
        String[][] base = new String[rows][13]; 

        if (cursor.moveToFirst()) {
            do {
                for (col=0;col<13;++col ){
                base[num][col] = (cursor.getString(col));} 
                ++num;
            } while (cursor.moveToNext());

            return base[s][t];
        }



        return null;

    }

完成后,我在我的问题课中阅读了这样的问题:

public void database_calls(){
          setCourseTag(courseTag);
          myDbHelper = new DataBaseHelper(getActivity());


            try {
                myDbHelper.createDataBase();
            } catch (IOException ioe) {
            throw new Error("Unable to create database");
            }

            try {
                myDbHelper.openDataBase();
            }catch(SQLException sqle){
                throw sqle;
            }

            String no= myDbHelper.getSome(ques,0, getCourseTag());
            String qu = myDbHelper.getSome(ques,1, getCourseTag());
            String a = myDbHelper.getSome(ques,2, getCourseTag());
            String b = myDbHelper.getSome(ques,3, getCourseTag());
            String c = myDbHelper.getSome(ques,4, getCourseTag());
            String d = myDbHelper.getSome(ques,5, getCourseTag());
            ans = myDbHelper.getSome(ques,6, getCourseTag());
            img = Integer.parseInt(myDbHelper.getSome(ques,8, getCourseTag()));
            exp = myDbHelper.getSome(ques,9, getCourseTag());
            year = myDbHelper.getSome(ques,10, getCourseTag());
            questionImage = myDbHelper.getSome(ques,11, getCourseTag());
            length = myDbHelper.getMax(getCourseTag());
        }

最近,我尝试使用year列(即第10列)来确定为每个测验会话选择的问题,以便用户可以选择任何一年的问题, /她想尝试。为了做到这一点,我在活动开始时使用了一个循环来过滤掉过去问题所需的年份。然后我将每个问题的索引转移到一个集合bal,从那里进行迭代等等。

public void countYearQuestions(){

        for(int y = 0; y < length; ++y){
            //year = myDbHelper.getSome(y,10, getCourseTag()); 

            if (selectedYear.equals(myDbHelper.getSome(y,10, getCourseTag())))
              bal.add(y);
        }
    }

这里,length是整个问题数据库的大小,用于课程(由getCourseTag()表示)。代码工作得很好。但它需要整整8-9秒!!加载活动。如何减少加载时间的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

你做这件事的方式非常有效,可以减慢一切(你的助手可以帮助你解决很多问题):

Local queue

在每个这样的行中,你执行一个查询,创建一个包含整个表格的2D数组,然后扔掉几乎所有东西。 而您未能关闭String no= myDbHelper.getSome(ques,0, getCourseTag());

所以你需要一个表中的12个值,而不是读整个表12次。