具体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