2015-08-01 3 views
1

У меня около 1500 записей в TABLE_CONTACT. Мой код, чтобы получить контакты:Android SQLiteDatabase SELECT запрос занимает много времени

public ArrayList<SBContact> getAllContacts() { 
    SQLiteDatabase database = dbHelper.getWritableDatabase(); 
    ArrayList<SBContact> mContacts = new ArrayList<SBContact>(); 
    String selectQuery = "SELECT * FROM " + SBDatabaseHelper.TABLE_CONTACT; 
    Cursor cursor = database.rawQuery(selectQuery, null); 

    if (cursor.moveToFirst()) { 
     do { 
      SBContact result = new SBContact(cursor.getString(cursor.getColumnIndex(SBDatabaseHelper.CONTACT_NUMBER)), 
        cursor.getString(cursor.getColumnIndex(SBDatabaseHelper.CONTACT_NAME)), cursor.getInt(cursor.getColumnIndex(SBDatabaseHelper.EXITS_USER))); 
      mContacts.add(result); 
     } while (cursor.moveToNext()); 
    } 
    return mContacts; 
} 

Проблема заключается в следующем: первый раз, когда я запускаю этот метод, он занимает около 15ms. Через 5 секунд я снова запускаю этот метод, он принимает около 20 seconds.

Аналогичным образом, после первого вызова, спустя 15 секунд, снова запустить метод, это займет около 10 seconds. И через 2 минуты, запустите этот метод снова, это займет около 15ms как первый раз.

В это время ни одна другая нить не делает запрос на чтение/запись в базу данных.

Я не понимаю, что такое SQLiteDatabase. Нужно ли время выпускать память или что-то делать?

EDITED К сожалению все это не проблема SQLiteDatabase. См. Мой ответ на более подробные сведения об этом случае.

+0

Выберите только строки из контакта, которые вы используете, вместо '*' –

+0

Вы имели в виду 'columns' вместо' rows'? Моя таблица имеет только 2 столбца, поэтому, я думаю, использование '*' не является проблемой. – t4nhpt

+0

да, извините, я имел в виду колонны! хороший catch дополнительно может быть готов протестировать запрос против rawQuery в объекте SQLiteDatabase для разницы в производительности. Насколько велик этот набор данных? –

ответ

0

Извините, все, моя ошибка.

Эта проблема не связана с SQLiteDatabase. Это связано с проблемой AsyncTask.

Мое дело: я запускаю AsyncTask, чтобы получить контакт из локальной базы данных (sqlite), и в то же время я запускаю новый поток с сервером (вызов api занимает много времени) в этой AsyncTask. Когда я запускаю AsyncTask для получения контактов снова (с помощью метода execute), старая AsyncTask все еще работает, и это предотвращает запуск нового. Вот почему новая задача занимает много времени. У меня есть исправление по методу executeOnExecutor, и результат метода немедленно возвращается.

Еще раз, извините, все.

2

Закройте курсор после каждого запроса

+0

Спасибо, моя ошибка, но это не решает проблему – t4nhpt

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