安卓:java.lang.IllegalStateException:数据库xxx.db(康涅狄格州#0)已关闭 [英] Android: java.lang.IllegalStateException: database xxx.db (conn# 0) already closed

查看:332
本文介绍了安卓:java.lang.IllegalStateException:数据库xxx.db(康涅狄格州#0)已关闭的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经阅读了很多关于此错误消息的话题,但我解决不了我的问题。

我对谷歌的应用程序中播放,我得到了用户的一些错误报告。当我尝试应用程序,一切工作正常。

在应用程序中,我管理一个大的数据库,像30桌。我关闭数据库在我的主要活动的onDestroy(),当查询完成所有的游标关闭。

我真的不知道为什么时不时的用户收到此错误消息。

下面是整个错误日志:

  java.lang.IllegalStateException:数据库/data/data/mdpi.android/databases/LocalDatabase.db(康涅狄格州#0)已关闭
在android.database.sqlite.SQLiteDatabase.verifyDbIsOpen(SQLiteDatabase.java:2213)
在android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1565)
在android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1525)
在android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1605)
在mdpi.android.database.LocalDatabase.getHistoryLastSuccessfullUpdate(LocalDatabase.java:661)
在mdpi.android.Journals $ 7.onItemClick(Journals.java:723)
在android.widget.AdapterView.performItemClick(AdapterView.java:292)
在android.widget.Gallery.onSingleTapUp(Gallery.java:960)
在android.view.GestureDetector.onTouchEvent(GestureDetector.java:1310)
在android.widget.Gallery.onTouchEvent(Gallery.java:937)
在android.view.View.dispatchTouchEvent(View.java:5724)
在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1964)
在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1725)
在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970)
在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739)
在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970)
在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739)
在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970)
在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739)
在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970)
在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739)
在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970)
在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739)
在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970)
在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739)
在com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2071)
在com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1405)
在android.app.Activity.dispatchTouchEvent(Activity.java:2426)
在com.android.internal.policy.impl.PhoneWindow $ DecorView.dispatchTouchEvent(PhoneWindow.java:2019)
在android.view.View.dispatchPointerEvent(View.java:5904)
在android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3155)
在android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2670)
在android.view.ViewRootImpl.processInputEvents(ViewRootImpl.java:1000)
在android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2679)
在android.os.Handler.dispatchMessage(Handler.java:99)
在android.os.Looper.loop(Looper.java:137)
在android.app.ActivityThread.main(ActivityThread.java:4517)
在java.lang.reflect.Method.invokeNative(本机方法)
在java.lang.reflect.Method.invoke(Method.java:511)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:993)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
在dalvik.system.NativeStart.main(本机方法)
 

和另一个问题:

 了java.lang.RuntimeException:无法启动活动ComponentInfo {mdpi.android/mdpi.android.UserInformations}:java.lang.IllegalStateException:数据库/data/data/mdpi.android /databases/LocalDatabase.db(康涅狄格州#0)已关闭
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2202)
在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2237)
在android.app.ActivityThread.access $ 600(ActivityThread.java:139)
在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1262)
在android.os.Handler.dispatchMessage(Handler.java:99)
在android.os.Looper.loop(Looper.java:154)
在android.app.ActivityThread.main(ActivityThread.java:4974)
在java.lang.reflect.Method.invokeNative(本机方法)
在java.lang.reflect.Method.invoke(Method.java:511)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
在dalvik.system.NativeStart.main(本机方法)
致:java.lang.IllegalStateException:数据库/data/data/mdpi.android/databases/LocalDatabase.db(康涅狄格州#0)已关闭
在android.database.sqlite.SQLiteDatabase.verifyDbIsOpen(SQLiteDatabase.java:2194)
在android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1536)
在android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1496)
在android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1576)
在mdpi.android.database.LocalDatabase.getUserInformations(LocalDatabase.java:357)
在mdpi.android.UserInformations.onCreate(UserInformations.java:122)
在android.app.Activity.performCreate(Activity.java:4538)
在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2158)
... 11更多
 

编辑:一个新的错误

今天,我得到了一个新的错误相关的数据库访问:

  java.lang.RuntimeException的:执行doInBackground时出错()

在android.os.AsyncTask $ 3.done(AsyncTask.java:278)
在java.util.concurrent.FutureTask中$ Sync.innerSetException(FutureTask.java:273)
在java.util.concurrent.FutureTask.setException(FutureTask.java:124)
在java.util.concurrent.FutureTask中$ Sync.innerRun(FutureTask.java:307)
在java.util.concurrent.FutureTask.run(FutureTask.java:137)
在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:569)
在java.lang.Thread.run(Thread.java:856)
显示java.lang.NullPointerException:产生的原因
在android.database.sqlite.SQLiteStatement.releaseAndUnlock(SQLiteStatement.java:290)
在android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:115)
在android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1718)
在android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1591)
在mdpi.android.database.LocalDatabase.insertCountry(LocalDatabase.java:143)
在mdpi.android.database.CountryTable.EnterCountry(CountryTable.java:21)
在mdpi.android.UserInformations $ insertCountryAsync.doInBackground(UserInformations.java:270)
在mdpi.android.UserInformations $ insertCountryAsync.doInBackground(UserInformations.java:1)
在android.os.AsyncTask $ 2.call(AsyncTask.java:264)
在java.util.concurrent.FutureTask中$ Sync.innerRun(FutureTask.java:305)
... 4个
 

解决方案

的onDestroy()当活动结束后/才会被调用销毁/从栈中删除。当你搬出活动的的onStop()将被调用。如果你需要保持当前的设计,只需调用close 的onStop()注意:当前活动的onStop会后的新/下一个活动的onCreate / onRestart调用。

如果你有一个单一的数据库,你可以使用SQLiteOpenHelper类所提到的pawelieba 你也可以在应用程序类的sqlite的分贝参考,你可以只使用在所有活动的参考,像

((MyApplication的)getApplication())。DB

只要打开分贝的onCreate()应用程序类,并关闭它在 onTerminate()

您也可以看看其他的SO答案这个错误。它已经问过很多次了。

<一个href="http://stackoverflow.com/questions/10797927/java-lang-illegalstateexception-database-not-open-android">java.lang.illegalstateexception数据库中未开放的Andr​​oid

<一个href="http://stackoverflow.com/questions/12420688/android-java-lang-illegalstateexception-database-already-closed">Android java.lang.IllegalStateException数据库已经关闭

<一个href="http://stackoverflow.com/questions/9529995/android-insert-the-data-sqlite-error-caused-by-java-lang-illegalstateexception">Android插入数据SQLite的误差由java.lang.IllegalStateException引起的:数据库无法打开

I have read a lot of topics about this error message but I can't resolve my problem.

I have an app on google play and I get some error reports from the users. When I am trying the app, everything works fine.

In the application, I am managing a big database with something like 30 tables. I am closing the database in my main activity onDestroy() and all the cursors are closed when the query is finished.

I really don't know why from time to time the users are getting this error message.

Here is the entire error log:

java.lang.IllegalStateException: database /data/data/mdpi.android/databases/LocalDatabase.db (conn# 0) already closed
at android.database.sqlite.SQLiteDatabase.verifyDbIsOpen(SQLiteDatabase.java:2213)
at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1565)
at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1525)
at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1605)
at mdpi.android.database.LocalDatabase.getHistoryLastSuccessfullUpdate(LocalDatabase.java:661)
at mdpi.android.Journals$7.onItemClick(Journals.java:723)
at android.widget.AdapterView.performItemClick(AdapterView.java:292)
at android.widget.Gallery.onSingleTapUp(Gallery.java:960)
at android.view.GestureDetector.onTouchEvent(GestureDetector.java:1310)
at android.widget.Gallery.onTouchEvent(Gallery.java:937)
at android.view.View.dispatchTouchEvent(View.java:5724)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1964)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1725)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1970)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1739)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2071)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1405)
at android.app.Activity.dispatchTouchEvent(Activity.java:2426)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2019)
at android.view.View.dispatchPointerEvent(View.java:5904)
at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3155)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2670)
at android.view.ViewRootImpl.processInputEvents(ViewRootImpl.java:1000)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2679)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4517)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
at dalvik.system.NativeStart.main(Native Method)

And another one:

java.lang.RuntimeException: Unable to start activity ComponentInfo{mdpi.android/mdpi.android.UserInformations}: java.lang.IllegalStateException: database /data/data/mdpi.android/databases/LocalDatabase.db (conn# 0) already closed
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2202)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2237)
at android.app.ActivityThread.access$600(ActivityThread.java:139)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:4974)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: database /data/data/mdpi.android/databases/LocalDatabase.db (conn# 0) already closed
at android.database.sqlite.SQLiteDatabase.verifyDbIsOpen(SQLiteDatabase.java:2194)
at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1536)
at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1496)
at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1576)
at mdpi.android.database.LocalDatabase.getUserInformations(LocalDatabase.java:357)
at mdpi.android.UserInformations.onCreate(UserInformations.java:122)
at android.app.Activity.performCreate(Activity.java:4538)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2158)
... 11 more

EDIT: One new error.

Today, I got a new error related to the database access:

java.lang.RuntimeException: An error occured while executing doInBackground()

at android.os.AsyncTask$3.done(AsyncTask.java:278)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
Caused by: java.lang.NullPointerException
at android.database.sqlite.SQLiteStatement.releaseAndUnlock(SQLiteStatement.java:290)
at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:115)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1718)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1591)
at mdpi.android.database.LocalDatabase.insertCountry(LocalDatabase.java:143)
at mdpi.android.database.CountryTable.EnterCountry(CountryTable.java:21)
at mdpi.android.UserInformations$insertCountryAsync.doInBackground(UserInformations.java:270)
at mdpi.android.UserInformations$insertCountryAsync.doInBackground(UserInformations.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:264)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
... 4 more

解决方案

onDestroy() will only be called when the activity is finished/destroyed/removed from stack. When you are moving out of the activity onStop() will be called. If you need to keep your current design, just call close in onStop(). NOTE: onStop of the current activity will be called after onCreate/onRestart of the new/next activity.

If you have one single DB you can use an SQLiteOpenHelper class as mentioned by pawelieba Also you can have the sqlite db reference in the Application class, and you can just use the reference in all activities, like

((MyApplication)getApplication()).db

Just open the DB in onCreate() of the Application class and close it in onTerminate().

You can also take a look at other SO answers for this error. It has been asked a lot of times before.

java.lang.illegalstateexception database not open android

Android java.lang.IllegalStateException database already closed

Android insert the data SQLite error Caused by java.lang.IllegalStateException: database not open

这篇关于安卓:java.lang.IllegalStateException:数据库xxx.db(康涅狄格州#0)已关闭的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆