2012-06-09 2 views
1

У меня этот код в активности для сбора данных из базы данных. Это займет 5 секунд до открытия активности. Без этого для работы требуется 2 секунды. Это там способ оптимизировать этот код?Android sql cursors slow

Все массивы (включая один в цикле: arr_calllog_name0) имеют 61 элемент на моем телефоне. В эмуляторе это быстро, с 6 элементами.

for (int i=0; i<arr_calllog_name0.size(); i++) 
    { 


     Cursor crname = info.getAllTitles_Stats2A(arr_calllog_name0.get(i), "1", d1, d2); 
     crname.moveToFirst(); 
     count_in = crname.getInt(0); 
     arr_calllog_numberin0.add(String.valueOf(count_in)); 



     Cursor crname2 = info.getAllTitles_Stats2A(arr_calllog_name0.get(i), "2", d1, d2); 
     crname2.moveToFirst(); 
     count_out = crname2.getInt(0); 
     arr_calllog_numberout0.add(String.valueOf(count_out)); 



     Cursor crname3 = info.sumAllTitles_StatsA(arr_calllog_name0.get(i), "1", d1, d2); 
     crname3.moveToFirst(); 
     sum_in = crname3.getInt(0); 
     arr_calllog_durationin0.add(String.valueOf(sum_in)); 



     Cursor crname4 = info.sumAllTitles_StatsA(arr_calllog_name0.get(i), "2", d1, d2); 
     crname4.moveToFirst(); 
     sum_out = crname4.getInt(0); 
     arr_calllog_durationout0.add(String.valueOf(sum_out)); 

    } 

информация объявляется как HotOrNot info = new HotOrNot(ChartsDuration.this); где HotOrNot является класс, содержащий DbHelper расширяет SQLiteOpenHelper класс.

Один запрос (другой почти такой же)

public Cursor getAllTitles_Stats2A(String name, String type, String date1, String date2) { 
     return ourDatabase.rawQuery("SELECT COUNT(*) FROM " + DATABASE_TABLE + " WHERE " + KEY_DATE + " BETWEEN '" + date1 + "'" + " AND '" + date2 + "'" + " AND " + KEY_NAME + " = '" + name + "'" + " AND " + KEY_TYPE + " = '" + type + "'" + " COLLATE NOCASE", null); 
    } 

DATABASE_TABLE имеет 500 пунктов в моем телефоне.

+0

Если вы выполняете четыре запроса на «элемент» (независимо от «элемента»), и есть 61 «элемент», это, вероятно, будет медленным. Однако, поскольку мы понятия не имеем, что такое '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ для тех, кто действительно поможет вам. – CommonsWare

+0

Я обновил свой вопрос. – erdomester

ответ

2

Никогда не используйте курсоры таким образом. Курсоры ценны (эффектно курсор - это таблица данных, а не указатель), поэтому они дороже создавать с точки зрения времени процессора. В вашем примере есть две очень серьезные проблемы.

  1. Не запускать запросы в обмен на петлю
  2. Всегда закрывать курсор, когда вы закончили с ним

Вы более склонны к succed, если вы можете найти способ сделать это с помощью JOIN, но без дополнительной информации сложно дать более решительное решение вашей проблемы.

+0

Запросы в цикле - это плохая практика, я согласен. Мне удалось сделать это без цикла for, но это не помогло. Зачем мне закрывать курсоры? Когда я не закрываю базу данных, я получаю сообщение об ошибке. Но в случае курсора. – erdomester

+0

Курсоры используют ресурсы (т. Е. Собирают память). Неспособность закрыть их вызовет проблемы с ресурсами. Обратите внимание, если вы используете управляемый курсор, тогда действие должно закрыть это для вас. Мне лучше управлять ими. Что касается ошибок базы данных, это обычная халатность открытия и закрытия баз данных для каждого вида деятельности. Это не смертельно, но если вы действительно хотите этого избежать, вам нужно реализовать одноэлементную модель для доступа к вашей базе данных, переполнив класс приложения по умолчанию. Вам нужно исследовать это. – Merlin