大家好,我是安卓系统的新手,使用绿色DAO管理数据库,但我经常遇到数据库未关闭的异常,就像我在Application onTeriminate()中所做的那样,我在整个应用程序中只维护数据库的单个连接,但在某些情况下,当我的应用程序转到后台并恢复数据库连接时,对象将变为null,我在使用之前通过检查对象的null来处理这个问题,但现在我经常收到的异常
android.database.sqlite.DatabaseObjectNotClosedException:应用程序没有关闭在此处打开的游标或数据库对象
请帮助我如何处理此
提前感谢
堆栈跟踪:01-03 09:39:18.688:E/SQLiteDatabase(3063):close()从未在数据库'/data/data.com/opera.mini.android/databases/google_analytics.db'上显式调用01-03 09:39:18.688:E/SQLiteDatabase(3063):android.database.sqlite.DatabaseObjectNotClosedException:应用程序没有关闭在此处打开的游标或数据库对象01-03 09:39:18.688:E/SQLiteDatabase(3063):在android.database.sqlite.SQLiteDatabase.(SQLiteDatabase.java:1943)01-03 09:39:18.688:E/SQLiteDatabase(3063):在android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1007)01-03 09:39:18.688:E/SQLiteDatabase(3063):在android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:986)01-03 09:39:18.688:E/SQLiteDatabase(3063):在android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1051)01-03 09:39:18.688:E/SQLiteDatabase(3063):在android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:787)01-03 09:39:18.688:E/SQLiteDatabase(3063):在android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)01-03 09:39:18.688:E/SQLiteDatabase(3063):在android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)01-03 09:39:18.688:E/SQLiteDatabase(3063):在android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelpr.java:157)01-03 09:39:18.688:E/SQLiteDatabase(3063):在com.google.android.apps.analytics。PersistentHitStore.loadExistingSession(未知来源)01-03 09:39:18.688:E/SQLiteDatabase(3063):在com.google.android.apps.analytics。PersistentHitStore。(未知来源)01-03 09:39:18.688:E/SQLiteDatabase(3063):在com.google.android.apps.analytics。PersistentHitStore。(未知来源)01-03 09:39:18.688:E/SQLiteDatabase(3063):在com.google.android.apps.analytics.AnalyticsReceiver.onReceive(未知来源)01-03 09:39:18.688:E/SQLiteDatabase(3063):在com.opera.mini.android.OpMiniInstallReferrerReceiver.onReceive(来源:15)01-03 09:39:18.688:E/SQLiteDatabase(3063):在android.app.ActivityThread.handleReceiver(ActivityThreads.java:2119)01-03 09:39:18.688:E/SQLiteDatabase(3063):在android.app.ActivityThread.access$1500(ActivityThreads.java:123)01-03 09:39:18.688:E/SQLiteDatabase(3063):在android.app.ActivityThread$H.handleMessage(ActivityThreads.java:1197)01-03 09:39:18.688:E/SQLiteDatabase(3063):在android.os.Handler.dispatchMessage(Handler.java:99)01-03 09:39:18.688:E/SQLiteDatabase(3063):在android.os.Looper.loop(Looper.java:137)01-03 09:39:18.688:E/SQLiteDatabase(3063):在android.app.ActivityThread.main(ActivityThreads.java:4424)01-03 09:39:18.688:E/SQLiteDatabase(3063):位于java.lang.reflect.Method.invokeNative(Native Method)01-03 09:39:18.688:E/SQLiteDatabase(3063):位于java.lang.reflect.Method.ioke(Method.java:511)01-03 09:39:18.688:E/SQLiteDatabase(3063):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteIndit.java:784)01-03 09:39:18.688:E/SQLiteDatabase(3063):在com.android.internal.os.ZygoteInit.main(ZygoteIndit.java:551)01-03 09:39:18.688:E/SQLiteDatabase(3063):在dalvik.system.NativeStart.main(Native Method)01-03 09:39:18.688:E/System(3063):终结器引发未捕获的异常01-03 09:39:18.688:E/System(3063):java.lang.IllegalStateException:没有数据库锁!01-03 09:39:18.688:E/System(3063):在android.database.sqlite.SQLiteDatabase.verifyLockOwner(SQLiteDatabase.java:2090)01-03 09:39:18.688:E/System(3063):在android.database.sqlite.SQLiteDatabase$1.entryRemoved(SQLiteDatabase.java:2182)01-03 09:39:18.688:E/System(3063):在android.database.sqlite.SQLiteDatabase$1.entryRemoved(SQLiteDatabase.java:2178)01-03 09:39:18.688:E/System(3063):在android.util.LruCache.trimToSize(LruCache.java:197)01-03 09:39:18.688:E/System(3063):在android.util.LruCache.removeAll(LruCache.java:285)01-03 09:39:18.688:E/System(3063):在android.database.sqlite.SQLiteDatabase.dellocCachedSqlStatements(SQLiteDatabase.java:2143)01-03 09:39:18.688:E/System(3063):在android.database.sqlite.SQLiteDatabase.closeClosable(SQLiteDatabase.java:1126)01-03 09:39:18.688:E/System(3063):在android.database.sqlite.SQLiteDatabase.finilize(SQLiteDatabase.java:11914)01-03 09:39:18.688:E/System(3063):在java.lang.Daemons$FinalizerDaemon.doFinalize(Daemon.java:182)01-03 09:39:18.688:E/System(3063):在java.lang.Daemons$FinalizerDaemon.run(Daemon.java:168)01-03 09:39:18.688:E/System(3063):在java.lang.Thread.run(Thread.java:856)
关闭连接的代码:
@Override
public void onTerminate() {
// TODO Auto-generated method stub
super.onTerminate();
snail_mail_db.close();
snail_mail_database_helper_obj.close();
}
您得到的异常是"应用程序没有关闭在此处打开的游标或数据库对象",因为当您打开连接时,您需要在操作完成时关闭该游标。使用db.close();在完成任何操作之后。
我扩展了Application类(作为App),并在那里打开和关闭数据库连接。然后,我的所有活动都可以通过theApp.getInstance().daoSession()
访问数据库,而无需在活动暂停或结束时关闭数据库。当最后一个活动结束时,Android将终止App,这将关闭DB连接。