2015-09-05 209 views
1

當我從教程中看到示例時,我發現getReadableDatabase db在最後沒有關閉,但對於​​,它總是在最後關閉。這是爲什麼?即使是文檔也指定我必須致電​​。我已經閱讀了這兩份文件,所以請不要簡單地將文件引述給我。謝謝。SQLiteDatabase使用後關閉或不關閉

+0

看看'close()'是如何實現的:http://androidxref.com/5.1.1_r6/xref/frameworks/base/core/java/android/database/sqlite/SQLiteClosable.java#105,似乎'close()'只在#of'acquireReference()'== #of'releaseReference()'時有效# – pskink

回答

-1

按照Android文檔sqlite database 可寫數據庫「一旦成功打開,數據庫緩存,所以您可以在每次需要寫入到數據庫時調用此方法。(請確保調用close()你不再當需要數據庫)。錯誤的權限或完整的磁盤等錯誤可能會導致此方法失敗,但如果問題得到解決,未來的嘗試可能會成功。「

由於可寫入內容一旦被打開就被緩存,這意味着它將佔用內存。 如果數據庫很大,那麼內存很大,所以不關閉或保持打開狀態可能會導致成員泄漏。

希望這有助於你:)

+0

是的,但是我看到一個問題:刪除和更新通常在末尾用'close'調用覆蓋。但是insert和bulkInsert不是。我個人的理解是插入不會「關閉」,因爲bulkInsert的默認實現只是簡單地調用insert,因此在每次迭代後調用close都可能會過度。所以有證據表明,對任何事情來說,close都是不必要的。那是對的嗎?那'關閉是不必要的*?即如果我不關閉,不會造成內存泄漏? –

+0

關閉是必要的。在插入操作期間,開發人員何時關閉,因爲他知道他是否需要插入更多內容。 –

+0

@Katedral Pillion請看我的編輯。 –

0

你需要保持數據庫,只要有在使用中,從它包含數據的遊標開放。我自己很少關閉數據庫,即使使用getWriteableDatabase()

+0

正如我上面問,這是因爲如果我保持數據庫打開沒有內存泄漏會發生? –

1

儘管文檔意味着什麼,有沒有真正getReadableDatabase()getWritableDatabase()之間的相關差異;都打開數據庫,並且該數據庫保持打開狀態,直到它是close() d。 所以這些例子是不正確的;他們應該以同樣的方式處理這兩種情況。

請注意,「當您不再需要數據庫時」並不一定表示您需要在每次查詢後關閉它;例如,如果某個活動可能多次訪問數據庫,則在活動啓動時將其打開並在活動停止時將其關閉即可。

打開的數據庫連接會保留一些內存爲它的高速緩存,系統將停止活動,如果它需要更多的內存,所以你應該確保沒有打開數據庫時沒有活動活動。