java.lang.IllegalStateException: attempt to re-open an already-closed object


from://http://blog.csdn.net/zhufuing/article/details/14455823

 

java.lang.IllegalStateException: attempt to re-open an already-closed object

分類: Exception Android SQLite   646人閱讀  評論(0)  收藏  舉報

        這個錯誤出現的原因是因為我在一個數據庫查詢方法中調用了另一個數據庫查詢方法,我的數據庫查詢方法都是在開始的時候獲取SQLiteDatabase對象,在結束的時候關閉SQLiteDabse對象,結果內部的數據庫查詢方法在結束的時候直接關閉了SQLiteDatabase對象,導致外面的數據庫查詢操作報錯,在這里大家不要以為多獲取了幾個SQLiteDatabase對象就可以了,每個線程只能使用一個SQLiteOpenHelper,也就使得每個線程使用一個SQLiteDatabase對象(多線程操作數據庫會報錯);

        解決辦法就是我不再關閉內部數據庫查詢方法的SQLiteDatbase對象或者將那個方法直接集成到外面的查詢方法中,當然,要確保這個查詢方法只會出現其他數據庫查詢方法中,要是單獨用這個方法,反而會因為SQLiteDatabase對象沒有關閉而報錯

 

產生原因:

假如你有A、B兩個異步線程操作sqlite數據庫。A是讀取,B是寫入,當A完成讀的時候調用close(),而B在這時正在執行寫的方法就會出現下面的異常。有人說去掉單例模式可以解決這個問題,但你不能忘記你在怎么單例使用的數據庫還是同一個,避免不了。

解決辦法:

如果你在一定的時間內需要重復的操作數據庫,那么不要調用close()方法,關閉游標就可以了。在你Activity注銷或者真正不再需要的時候調用數據庫的colse()方法.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM