在Android中重新使用遊標對象以在數據庫上進行多個查詢是否是一種很好的做法?我需要在查詢之間調用deactivate()嗎?我在第二個查詢後停用遊標,但我仍然在logcat中收到DatabaseObjectNotClosedException警告。Android重新使用遊標
回答
以我的經驗,你可以將光標設置爲新的東西。我嘗試過在其上調用deactivate(),但是這弄亂了我的應用程序,所以我決定不使用它。我不知道這是否是好的做法,但它對我來說工作得很好,就我的測試而言,它似乎不會泄漏或放慢速度。
那麼,requery()
已被棄用,bur由於某種原因deactivate()
不是。如果沒有另一個,你不能真正使用它,所以我猜你可能會認爲你不應該使用deactivate()
。在任何情況下,一旦完成它就關閉一個光標將消除所有那些討厭的DatabaseObjectNotClosedException
的。新的加載器框架鼓勵返回新的遊標,舊代碼在您替換它們時會自動關閉。
這是不正確的。您可以使用停用而不使用重新查詢。 Requery已被棄用,因爲您不需要調用它。你可以調用deactivate,然後通過調用database.rawQuery()或類似的東西來創建一個新的遊標。 – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
爲什麼叫停用呢? –
requery()
和deactivate()
現在已被棄用(自API 11開始的第一個,後者自API 16開始)。我正在回答這個差不多7年的問題,因爲我相信還沒有給出正確的答案。
根據我的經驗,重新使用Cursor
對象是一種不好的做法。我的SQLiteOpenHelper
類的實現有幾種方法,我關閉了所有這些對象中的Cursor
對象 - 並且我相信由於在每個方法結束時關閉了Cursor
對象,所以它是正確的。但在某些方法中,我重新使用一個Cursor
對象來保存來自多個查詢的結果(首先我運行了一個查詢,然後我讀取並使用了Cursor
的結果,然後運行了一個我認爲會簡單的查詢覆蓋已使用的Cursor
中的舊結果)。啓用StrictMode
證明了我的錯誤。我開始變得DatabaseObjectNotClosedException
崩潰。
我修復它不再使用Cursor
對象。現在我爲每個查詢創建一個新的Cursor
變量,然後讀取並保存結果,並且我在Cursor
上調用close()
方法,不再使用它。如果我需要在該方法中運行另一個查詢,我故意不再使用舊的Cursor
,而且我總是創建一個新變量。即使啓用了StrictMode
,我也不會再收到任何警告或崩潰。我相信垃圾收集器的工作是正確的,所以我不認爲創建Cursor
類的多個實例是一個巨大的問題。另一方面,僅使用一個Cursor
對象就像一個問題似乎 - 因此您的警告和我的崩潰StrictMode
。
我不是數據庫專家,我仍然在學習Android編程的最佳實踐,但我相信在這個話題上我是正確的 - 不要重複使用Cursor
對象,或者您可以開始獲取內存泄漏,警告甚至崩潰。
- 1. SQL更新使用遊標
- 2. 更新android simplecursoradapter遊標
- 3. 重複使用遊標與創建新遊標的權衡是什麼?
- 4. pyodbc遊標重用
- 5. 使用遊標訪問單行android
- 6. Android使用multipe遊標填充listview
- 7. Android遊標與ORMLite在CursorAdapter中使用
- 8. 使用新班級? Android遊戲開發
- 9. 使用PL/SQL中的更新遊標
- 10. 在SQL Server中使用遊標更新
- 11. 更新表不使用遊標
- 12. Android - 遊標已棄用
- 13. Android EditText遊標不可用
- 14. 遊標無法使用遊標url?
- 15. 指針遊標覆蓋等待遊標即使!重要
- 16. 使用psycopg2時,重新聲明遊標是否創建新連接?
- 17. Android:刪除數據庫行後如何重新查詢遊標以刷新ListView?
- 18. 重新使用Android佈局
- 19. SQL遊標使用
- 20. android遊標到JSONArray
- 21. Android AlertDialog和遊標
- 22. Android遊標頭疼
- 23. 在遊戲重新居中前獲取遊標在遊戲中的位置
- 24. t-sql遊標:是否「首先獲取」重新生成遊標的內容?
- 25. 遊戲中心 - 重新連接遊戲
- 26. NIM遊戲 - 重新運行遊戲
- 27. Web應用程序:保持DB遊標還是重新創建?
- 28. 如何使遊標在Android中變黑
- 29. CCUserDefault,ios/android遊戲和遊戲更新
- 30. 重複的sql遊標
遊標不會進行查詢,它保存查詢的結果。我看不出有什麼理由不能將它設置爲空,然後重新使用它。 – Jack
經過再看看文檔,我相信我需要調用deactivate()然後請求一個新的遊標。我不相信在請求新的遊標之前將它設置爲null是必要的。 – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz