當我從教程中看到示例時,我發現getReadableDatabase
db在最後沒有關閉,但對於,它總是在最後關閉。這是爲什麼?即使是文檔也指定我必須致電。我已經閱讀了這兩份文件,所以請不要簡單地將文件引述給我。謝謝。SQLiteDatabase使用後關閉或不關閉
回答
按照Android文檔sqlite database 可寫數據庫「一旦成功打開,數據庫緩存,所以您可以在每次需要寫入到數據庫時調用此方法。(請確保調用close()你不再當需要數據庫)。錯誤的權限或完整的磁盤等錯誤可能會導致此方法失敗,但如果問題得到解決,未來的嘗試可能會成功。「
由於可寫入內容一旦被打開就被緩存,這意味着它將佔用內存。 如果數據庫很大,那麼內存很大,所以不關閉或保持打開狀態可能會導致成員泄漏。
希望這有助於你:)
是的,但是我看到一個問題:刪除和更新通常在末尾用'close'調用覆蓋。但是insert和bulkInsert不是。我個人的理解是插入不會「關閉」,因爲bulkInsert的默認實現只是簡單地調用insert,因此在每次迭代後調用close都可能會過度。所以有證據表明,對任何事情來說,close都是不必要的。那是對的嗎?那'關閉是不必要的*?即如果我不關閉,不會造成內存泄漏? –
關閉是必要的。在插入操作期間,開發人員何時關閉,因爲他知道他是否需要插入更多內容。 –
@Katedral Pillion請看我的編輯。 –
你需要保持數據庫,只要有在使用中,從它包含數據的遊標開放。我自己很少關閉數據庫,即使使用getWriteableDatabase()
。
正如我上面問,這是因爲如果我保持數據庫打開沒有內存泄漏會發生? –
儘管文檔意味着什麼,有沒有真正getReadableDatabase()
和getWritableDatabase()
之間的相關差異;都打開數據庫,並且該數據庫保持打開狀態,直到它是close()
d。 所以這些例子是不正確的;他們應該以同樣的方式處理這兩種情況。
請注意,「當您不再需要數據庫時」並不一定表示您需要在每次查詢後關閉它;例如,如果某個活動可能多次訪問數據庫,則在活動啓動時將其打開並在活動停止時將其關閉即可。
打開的數據庫連接會保留一些內存爲它的高速緩存,系統將停止活動,如果它需要更多的內存,所以你應該確保沒有打開數據庫時沒有活動活動。
- 1. 關閉或不關閉Oracle連接?
- 2. Windows窗體關閉後不關閉?
- 3. 關閉還是不關閉?
- 4. 關閉調用關閉()該用戶界面不關閉
- 5. SQLiteDatabase創建並從未關閉
- 6. 關閉或關閉一個div
- 7. 如果它打開或關閉,則關閉div如果關閉
- 8. 鳥舍關閉後立即關閉
- 9. Bootstrap Modal關閉後CSS過渡關閉
- 10. Jquery SelectMenu在關閉後關閉SimpleModal
- 11. 關閉表單後關閉線程?
- 12. 套接字關閉後關閉線程
- 13. 關閉後ColorBox的幻燈片關閉
- 14. 關閉應用程序後,GPS更新將不會關閉
- 15. 確保MySQL關閉或使用MysqldResource將其關閉
- 16. 無法使用[NSWindow關閉]或[NSWindow performClose:(id)]關閉窗口(QuickTime)
- 17. 使用setSelection()後,Android微調不關閉()
- 18. 如何在使用GNU屏幕時關閉emacs(或vi)後關閉屏幕?
- 19. 關閉/關閉WCSession
- 20. 使用關閉而不是關閉重新使用套接字
- 21. 在我使用或不使用後關閉數據庫連接?
- 22. 關閉聲明;或不?
- 23. PopupWindow不關閉後退鍵
- 24. 關閉或綁定
- 25. 關閉或處理
- 26. Backgroundworker線程不關閉程序關閉?
- 27. 管道關閉不需要關閉
- 28. 關閉按鈕不關閉表格
- 29. Windows窗體:關閉,但不關閉
- 30. 關閉BufferedReader而不關閉包裝流
看看'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