【问题标题】:Getting values from multi-dimensional array too slow从多维数组中获取值太慢
【发布时间】:2015-06-10 14:26:32
【问题描述】:

美好的一天, 我一直在进行一个 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);
        }
    }

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

【问题讨论】:

  • 为什么是数组?为什么不让数据库为你做过滤呢?
  • @CL。天哪,我没想到。所以本质上,我可以简单地在 DB 助手类中从 sqlite db 进行过滤。我相信这应该加快进程,对吧?

标签: java android arrays performance sqlite


【解决方案1】:

你这样做的方式在减慢一切方面非常有效(你的助手会帮助你很多):

String no= myDbHelper.getSome(ques,0, getCourseTag());

在执行查询的每一行中,创建一个包含整个表的 2D 数组并丢弃几乎所有内容。 而你没有关闭Cursor

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

【讨论】:

  • 感谢您的大开眼界,我的第一个解决方案是让getSome() 方法创建所需列的一维数组 (1D)。我相信如果我这样做,整个表格不会被读取 12 次,而是每列都会被读取,从而使表格只被读取一次。我说得对吗?
  • 试过了,正如预期的那样,一切都加快了,包括所有问题的刷新。所以,关于如何提高性能的任何更多提示,看到加载时间减少到 3 秒,我仍然觉得可以更少。
  • 我会放弃帮助程序并为getCourseTag 使用局部变量(不知道这个调用有多昂贵)。如果您需要单行中的所有列,这是一个查询 (SELECT ... WHERE ..),最多需要几毫秒。
  • 真的很抱歉,我在(SELECT ... WHERE ..) 部分失去了你,我的sqlite 知识并不丰富。我打算将所有行放在一个列中,如何使用 sqlite 命令执行此操作,替换一维数组?
  • @Mofe-hendyEjegi 单列和所有行?这很奇怪,关于转置它的事情。不管怎样,你可以用SELECT theWantedColumnName FROM tableName 来做,没有任何二维数组。
猜你喜欢
  • 2015-05-20
  • 2018-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多