У меня есть БД SQLite и есть метод, который считывает данные из таблицы, и отдает массив. У меня сейчас в таблице 1800 записей и этот метод работает очень медленно. Можно ли его как-то оптимизировать?
public static ArrayList
} while (c.moveToNext());
} else
Log.d("Nothing in DB", "0 rows");
c.close();
return docTypes;
}
Ответ
При работе с данными, хранящимися в БД, не рекомендуется делать дополнительные копирования в какие то коллекции, массивы и тп., так как это может занимать достаточно много времени при определенном количестве данных. Рекомендуется работать напрямую с Cursor и соответствующими адаптерами.
Для связи данных в БД с ExpanadableListView имеется класс-адаптер SimpleCursorTreeAdapter, одной из особенностей которого является выборка данных по мере надобности (раскрытия пунктов списка), что положительно сказывается на производительности.
Для работы с этим адаптером понадобится организация определенной структуры БД, состоящая из двух таблиц: таблицы с заголовками пунктов (группы) и таблицы с содержимым для раскрывающегося списка, связанные с заголовками их ID (подпункты одной группы промаркированы ID этой группы).
Адаптер выводит список, состоящий из пунктов первой таблицы, как обычный SimpleCursorAdapter, так же при реализации адаптера необходимо реализовать метод getChildrenCursor(), который будет осуществлять запрос для выборки данных раскрывающейся части списка (из второй таблицы по ID группы). Смотрите пример реализации
Так же вы можете использовать класс CursorLoader для большей оптимизации за счет асинхронных запросов в БД. Данный класс так же берет на себя обязанности по управлению курсором (не требуется самостоятельно его закрывать при ненадобности или восстанавливать при сменах состояния и др). Пример реализации с CursorLoader
PS: хочу отметить, что работа с SQLite в Android реализована достаточно громоздко и "многострочно", а составление и обработка запросов вызывает много трудностей, я бы рекомендовал использовать вместо SQL, базы данных на основе ORM, лучшей из которых считаю Realm. Это позволяет работать с более понятными сущностями, как POJO-объекты, количество кода существенно сократится, а CRUD-операции будут более Java-подобные.
Комментариев нет:
Отправить комментарий