2010-08-02 58 views
11

我正在創建基本上是蘑菇上的信息列表的Android應用程序。我從sqlite數據庫中獲取這些信息。我有一個全球單身人士,裏面有一個服務類,我用它來訪問我的數據庫。幾乎每個活動都訪問數據庫。隨着我需要數據,將我的db始終打開還是打開並關閉它會更好?Android中的數據庫訪問

如果最佳做法是始終打開它,那麼我需要確保關閉它,以及在活動被破壞時如果將其保持打開狀態,最壞的情況是什麼?

回答

0

基於我過去在Java中的經驗,我認爲最好關閉連接,但在小型Android應用程序中可能並不重要,但如果您有10個應用程序正在運行並且它們都可以訪問數據庫,那麼您有10個掛起的連接。再啓動一些,遲早會有另一個應用程序需要等待,因爲SQL服務器不能處理更多的請求。

我想你可以把它想成你的電腦上的一個文件。您從中讀取數據,然後在完成後關閉它。爲什麼要在應用程序中打開文件?

現在我對Android編程非常陌生,所以我還沒有完成數據庫調用。但是,幾年前,當我在Java應用程序中遇到同樣的問題時,我實現了一個數據庫對象,在該數據庫對象中我連接了數據庫。 「其他人」(類)不得不調用數據庫對象(singleton或final方法)來獲取數據,而不是像存儲過程那樣,而是在應用程序中。

正因爲如此,我知道什麼時候發生的呼叫以及何時停止。然後我進入超時狀態,好像幾分鐘內沒有任何事情發生,我將關閉與db的連接。 (這也處理了一些超時異常,因爲連接的超時不會發生。)當一個新的調用進入時,我可以很容易地啓動一個新的連接並使用新的數據庫連接。

基本上,我通過方法public Fungus[] getAllFungus()public Fungus[] getFilteredFungus(string where)抽象出SQL調用。

+0

如果你在Android中實現一個數據庫,你應該使用'SQLiteOpenHelper'或者'ContentProvider'來管理你的連接。然後你可以返回'Cursor',它可以讓你遍歷結果集,或者很容易地將它放在列表中。 – 2011-02-03 18:45:09

1

我會根據需要打開數據庫。通過這種方式,您一定知道一旦打開它的特定活動完成,連接就會關閉。儘管Android已經內置了檢查程序以確保在應用程序終止時它關閉,但它並不會傷害到安全的一面。我也猜測它一直打開可能導致泄漏或什麼。

+0

嗯,我打開數據庫,使用它,然後關閉,一旦我完成。當我開始另一項活動時,我再次打開onResume並關閉onPause(和onDestroy)。新活動的行爲相同。當我銷燬當前活動並返回到前一個屏幕時,我的適配器會在調用onResume之前嘗試重新連接到數據庫,並且我得到異常'有關fillWindow的一些事情'。 – 2010-08-03 02:47:52

+0

嗯 要在調用getWritable之前避免fillWindow異常您的dboject處理程序對象上的數據庫調用關閉它可能會關閉onFinish或onStop。 – 2010-08-05 11:22:27

+0

你說你把它關閉onDestroy。 onDestroy可能會在不同活動的onResume之後被調用。這將導致你的全局數據庫關閉一些你不想要的東西:) – Moncader 2010-08-06 05:23:02

10

這裏最好的選擇是重構,以便您的應用程序通過ContentProvider訪問數據庫。您的ContentProvider實現是打開數據庫句柄的唯一方式。

這給你幾個優點:

  • 只有一兩件事,有數據庫開放的,所以你的問題只是消失。
  • 大量的標準支持類來自動化數據庫管理等內容。
  • 與標準Android列表管理視圖更好地集成,這些視圖全都設計爲可以使用ContentProviders提供的光標自動工作。
  • 您的所有數據都可以通過URI(通常爲「content://com.fnord.mushroom/mushroom/43」形式)來解決,這意味着其他應用程序也可以訪問您的數據。

使用ContentProvider,可以將三個或四個標準類粘合在一起以生成瀏覽器接口到您的數據庫,並且實際上不必編寫任何實際的邏輯。

不利的一面是,ContentProviders只能真正支持通過有限接口進行訪問---用SQL術語來說,您可以在沒有嵌套子句的情況下獲得INSERT,SELECT,UPDATE和DELETE。如果您正在執行復雜的SQL工作,將請求從您的應用程序路由到ContentProvider然後再返回可能會有點痛苦。然而,大多數人不需要這樣做(如果你這樣做,定製意圖是要走的路)。