大家好我刚接触到android并使用绿色DAO来管理数据库,但我经常得到一个数据库未关闭异常,因为iam在Application onTeriminate()中这样做,我只维护数据库的单一连接,但在某些情况下当我的应用程序转到后台并恢复数据库连接对象变为空时,我通过在使用之前检查对象的空值来处理问题,但现在我经常得到例外
android.database.sqlite.DatabaseObjectNotClosedException:应用程序未关闭此处打开的游标或数据库对象
请帮我解决这个问题
先谢谢
堆栈跟踪: 01-03 09:39:18.688:E / SQLiteDatabase(3063):从未在数据库' /data/data/com.opera.mini.android/databases/google_analytics.db'上显式调用close(); 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(SQLiteOpenHelper.java:157) 01-03 09:39:18.688:E / SQLiteDatabase(3063):at com.google.android.apps.analytics.PersistentHitStore.loadExistingSession(Unknown Source) 01-03 09:39:18.688:E / SQLiteDatabase(3063):at com.google.android.apps.analytics.PersistentHitStore。(Unknown Source) 01-03 09:39:18.688:E / SQLiteDatabase(3063):at com.google.android.apps.analytics.PersistentHitStore。(Unknown Source) 01-03 09:39:18.688:E / SQLiteDatabase(3063):at com.google.android.apps.analytics.AnalyticsReceiver.onReceive(Unknown Source) 01-03 09:39:18.688:E / SQLiteDatabase(3063):at com.opera.mini.android.OpMiniInstallReferrerReceiver.onReceive(来源:15) 01-03 09:39:18.688:E / SQLiteDatabase(3063):在android.app.ActivityThread.handleReceiver(ActivityThread.java:2119) 01-03 09:39:18.688:E / SQLiteDatabase(3063):在android.app.ActivityThread.access $ 1500(ActivityThread.java:123) 01-03 09:39:18.688:E / SQLiteDatabase(3063):在android.app.ActivityThread $ H.handleMessage(ActivityThread.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(ActivityThread.java:4424) 01-03 09:39:18.688:E / SQLiteDatabase(3063):at java.lang.reflect.Method.invokeNative(Native Method) 01-03 09:39:18.688:E / SQLiteDatabase(3063):at java.lang.reflect.Method.invoke(Method.java:511) 01-03 09:39:18.688:E / SQLiteDatabase(3063):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784) 01-03 09:39:18.688:E / SQLiteDatabase(3063):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 01-03 09:39:18.688:E / SQLiteDatabase(3063):at 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.evictAll(LruCache.java:285) 01-03 09:39:18.688:E / System(3063):在android.database.sqlite.SQLiteDatabase.deallocCachedSqlStatements(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.finalize(SQLiteDatabase.java:1914) 01-03 09:39:18.688:E / System(3063):at java.lang.Daemons $ FinalizerDaemon.doFinalize(Daemons.java:182) 01-03 09:39:18.688:E / System(3063):at java.lang.Daemons $ FinalizerDaemon.run(Daemons.java:168) 01-03 09:39:18.688:E / System(3063):at 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();
}
答案 0 :(得分:0)
您收到此异常“应用程序未关闭此处打开的游标或数据库对象”,因为当您打开连接时,需要在操作完成时关闭该游标。使用db.close();完成任何操作后。
答案 1 :(得分:0)
我扩展Application类(作为App)并在那里打开和关闭数据库连接。然后我的所有活动都可以通过theApp.getInstance().daoSession()
访问数据库,而不会在活动暂停或结束时关闭数据库。 Android将终止theApp,它将在最后一个活动完成时关闭数据库连接。