Cursor c = db.rawQuery("select _id, first,second from mainTable", null);
ClientCursorAdapter adapter = new ClientCursorAdapter(this, R.layout.listview, c, 0 );
listView.setAdapter(adapter);
//c.close();
После этого в ListView передается курсор и на нем отображается содержимое курсора, но, если я закрываю курсор в конце, то в приложении выходит ошибка - курсором же все еще пользуется ListView. А если оставляю курсор открытым, то есть убираю c.close(), то все нормально - ошибок нету.
Оставлять курсор открытым – это же неправильно. Что тут можно придумать?
Для работы с курсором в Android есть замечательный класс CursorLoader, который самостоятельно следит за его жизненным циклом и актуальным состоянием (самостоятельно закрывает курсор, когда им больше не пользуются и обновляет его при изменении данных), так же решает проблемы изменения конфигурации (поворота), работает в асинхронном режиме и другие преимущества.
Официальная документация
Пример использования в адаптере с двумя типами данных и фильтром
Добавлю свои пять копеек:
целиком поддерживая пост @pavloff - вынужден признать, что бывают случаи, когда не все можно отработать в рамках CursorLoader
В таких случаях, когда трудно лоцировать когда нужно закрывать Cursor'ы надо их закрывать в методе onDestroy() активити. Если речь идет о диалоге, то закрывать их в onDismiss(). Для фрагментов - лучшее место onDestroyView()
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости