2010-10-08 4 views
3

В последние дни у меня часто возникало много сообщений об ошибках из-за утечки базы данных в моем приложении, поэтому теперь я открываю базу данных, получаю от нее результаты запроса и снова закрываю БД.Закрыть или не закрыть?

Но я также использую курсорный адаптер для своего автозаполнения.

Должен ли я также сделать это таким образом: открыть DB, получить курсор, закрыть DB ?!

Я имею в виду, у меня нет никаких проблем из-за этого не делает, но ...

Так что мне нужны советы от экспертов, советы от вас

+0

Наконечник: «советы» не «подсказки» – skyfoot

+0

извините за эту ошибку :) – Tima

ответ

2

Вы должны иметь возможность открыть базу данных в методе onCreate и закрыть ее в методе onDestroy. Это гарантирует, что он будет доступен до тех пор, пока активность «жива» и что в конечном итоге она будет очищена.

Кроме того, вы, вероятно, должны использовать «startManagingCursor» в курсоре, который вы используете с вашим адаптером. Это гарантирует, что он будет деактивирован, запрошен и закрыт по необходимости при паузе, возобновлении и уничтожении соответственно. Курсоры, которые не используются в адаптерах, должны быть закрыты, как только вы закончите получать данные от них.

Не допускайте утечек, если вы будете следовать этим правилам.

+2

Я не понимаю людей из Google. Они дают несколько руководств по использованию базы данных или курсоров (например, учебник по блокноту). Я никогда не видел там никакого близкого метода для курсоров или для базы данных ... Я также попробовал startManagingCursor, но у меня проблемы с этим ... не могу вспомнить, почему – Tima

+0

Ну, недостаток ближайших курсоров, вероятно, потому что все, что они делают, покрывается startManagingCursor, который они агрессивно продвигают. Неспособность закрыть БД в onDestroy, конечно, неряшливо, но я не знаю, насколько это опасно. – beekeeper

0

Вы всегда должны закрыть соединение с базой данных.

+0

Я просто подумал, если имеет смысл повторно открывать БД каждый раз, когда пользователь вводит новый символ в autocompletetextview. Может быть, есть и другие решения ?! – Tima

+0

Ну, открытие соединения с БД довольно дорого, поэтому это зависит от контекста приложения. Наиболее идеальным вариантом было бы открытие соединения с БД как можно позже, оставив его открытым до тех пор, пока не будет вызван последний запрос, а затем, наконец, его закрытие. –

+0

В моем случае это будет время, когда пользователь будет готов с набрав и нажмите запись из списка предложений или кнопки. но как должен указывать cursoradapter. Я не вижу никакого способа уничтожить или закрыть cursoradapter ... но у меня есть идея. я реализовал пользовательский адаптер курсора, поэтому я могу написать метод close ... спасибо :) – Tima

0

не рассматривают использование finalize() для закрытия соединения с БД. нет никакой гарантии, когда это будет вызвано, или даже если это когда-нибудь будет вызвано. для получения дополнительной информации см. статью «Эффективная Java» второй редакции 7.

Вы можете использовать onPause(), onResume() для закрытия или открытия соединения? Я считаю, что андроид дает некоторую гарантию того, что они называются.

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