2015-06-10 2 views
0

Good Day, Я работаю над обновлением в проекте 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 секунд! для загрузки. Любая помощь по сокращению времени загрузки будет оценена по достоинству.

+1

Почему массив? Почему бы вам не позволить базе данных делать фильтрацию для вас? –

+0

@CL. omg, я не думал об этом. Таким образом, по сути, я могу просто выполнить фильтрацию из sqlite db в классе помощника DB. Я считаю, что это должно ускорить процесс, верно? –

ответ

1

, как вы делаете это довольно эффективно замедляя все вниз (и ваш помощник поможет вам с ним много):

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

В каждой такой строке выполнить запрос, создать 2D массив держа весь стол и бросая почти все. И вы не можете закрыть Cursor.

Таким образом, вам нужно 12 значений из таблицы и вместо этого читать всю таблицу 12 раз.

+0

Спасибо за внимание, первым решением для этого было бы сделать метод getSome() 'создать единый размерный массив (1D) нужного столбца. Я считаю, что если я это сделаю, вся таблица будет читаться не 12 раз, а, скорее, каждый столбец, тем самым сделав таблицу прочитанной только один раз. Я прав? –

+0

Пробовал и, как и ожидалось, все ускорилось, в том числе все вопросы освежились. Итак, больше советов о том, как повысить производительность, поскольку время загрузки сокращается до 3 секунд, что, по-прежнему чувствую, может быть меньше. –

+0

Я бы бросил помощника и использовал локальную переменную для 'getCourseTag' (не знаю, как дорого этот звонок). Если вам нужны все столбцы из одной строки, это единственный запрос ('SELECT ... WHERE ..') и должен занимать не более нескольких миллисекунд. – maaartinus

Смежные вопросы