У меня около 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
. См. Мой ответ на более подробные сведения об этом случае.
Выберите только строки из контакта, которые вы используете, вместо '*' –
Вы имели в виду 'columns' вместо' rows'? Моя таблица имеет только 2 столбца, поэтому, я думаю, использование '*' не является проблемой. – t4nhpt
да, извините, я имел в виду колонны! хороший catch дополнительно может быть готов протестировать запрос против rawQuery в объекте SQLiteDatabase для разницы в производительности. Насколько велик этот набор данных? –