2012-04-12 107 views
5

概述:在onStart和異步任務中打開數據庫連接變得相當複雜。擁有全局可用的數據庫連接是不好的做法嗎?如果不好,什麼是更好的方法?Android何時應該打開和關閉數據庫連接?

詳細信息:我有一個應用程序連接到sqlite3數據庫的幾個活動。起初,我不需要訪問數據庫的地方很多,所以每次需要訪問時我都會打開和關閉。然後有更多需要訪問它的地方,正如另一個Stack Overflow問題所建議的那樣,我開始在需要連接的onStart方法中打開數據庫連接,並在onStop方法中關閉它。

這工作得很好,直到我開始需要某些超出活動時間的異步任務連接。由於該活動的onStop方法已被調用並且連接已關閉,所以在異步任務嘗試訪問數據庫時失敗。作爲解決方案,我爲在onPreExecute方法中打開並在onPostExecute方法中關閉的每個異步任務創建了單獨的連接。

這導致了很多連接的打開和關閉,我想知道是否在應用程序上下文中創建全局可用的數據庫連接是個好主意。如果我忘記關閉連接或應用程序關閉,它肯定會清理很多代碼並刪除發生的任何未關閉的db異常。任何其他人試過這個/看到這種方法的任何問題?

+0

這是很好的做法,做到這一點。要避免的主要問題是使用應用程序上下文的內存泄漏,如果僅用於數據庫操作,這應該不是問題。 – stealthcopter 2012-04-12 19:46:28

回答

2

幾周前我遇到了類似的問題。我使用了幾個在SQLite數據庫中具有持久性的類。

正如我想解除持久性的活動,我創建了靜態內部類(稱爲經理)爲那些需要持久性。每次我實例化一個管理器時,都會創建一個數據庫連接,並且在使用管理器之後,我明確地關閉它。如果我有全局管理員訪問這些表,那麼他們應該由於併發性而同步,並且我不知道什麼時候應該關閉這些數據庫連接。所以我這樣做了。

希望這會有所幫助!

+0

謝謝,沒有考慮併發問題,這是我正在尋找的。 – odiggity 2012-04-13 14:09:41

+0

不客氣!樂意效勞! :) – Caumons 2012-04-15 22:01:00

2

您可以創建一個BaseAsyncTask,其onPreExecute()和onPostExecute()負責打開和關閉數據庫連接。

AsyncTasks可以擴展BaseAsyncTask調用super.onPreExecute()和super.onPostExecute()並在doInBackground()方法中執行數據的實際加載。

+0

不得不接受其他答案,因爲它更好地回答了我的問題,但我一定會這樣做。謝謝! – odiggity 2012-04-13 14:09:05

相關問題