java.lang.IllegalStateException: attempt to ~~~

具體bug以下:
java.lang.IllegalStateException: attempt to re-open an already-closed object: android.database.sqlite.SQLiteQuery (mSql = SELECT PackageName, Version, CtrlStatus FROM cooee_hide_packs) 
	at android.os.Parcel.readException(Parcel.java:1330)
	at android.os.Parcel.readException(Parcel.java:1276)
	at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1351)
	at android.app.Instrumentation.execStartActivity(Instrumentation.java:1374)
	at android.app.Activity.startActivityForResult(Activity.java:2827)
	at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:817)
	at android.app.Activity.startActivity(Activity.java:2933)
	at cn.app.activity.news.BaseActivity.onClick(Xs8_News_BaseActivity.java:257)
	at android.view.View.performClick(View.java:2485)
	at android.view.View$PerformClick.run(View.java:9080)
	at android.os.Handler.handleCallback(Handler.java:587)
	at android.os.Handler.dispatchMessage(Handler.java:92)
	at android.os.Looper.loop(Looper.java:130)
	at android.app.ActivityThread.main(ActivityThread.java:3714)
	at java.lang.reflect.Method.invokeNative(Native Method)
	at java.lang.reflect.Method.invoke(Method.java:507)
	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:853)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611)
	at dalvik.system.NativeStart.main(Native Method)

        這個錯誤出現的緣由是由於我在一個數據庫查詢方法中調用了另外一個數據庫查詢方法,個人數據庫查詢方法都是在開始的時候獲取SQLiteDatabase對象,在結束的時候關閉SQLiteDabse對象,結果內部的數據庫查詢方法在結束的時候直接關閉了SQLiteDatabase對象,致使外面的數據庫查詢操做報錯,在這裏你們不要覺得多獲取了幾個SQLiteDatabase對象就能夠了,每一個線程只能使用一個SQLiteOpenHelper,也就使得每一個線程使用一個SQLiteDatabase對象(多線程操做數據庫會報錯);java

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

 

產生緣由:sql

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

解決辦法:多線程

     若是你在必定的時間內須要重複的操做數據庫,那麼不要調用close()方法,關閉遊標就能夠了。在你Activity註銷或者真正再也不須要的時候調用數據庫的colse()方法.app

相關文章
相關標籤/搜索