【发布时间】:2012-12-06 11:47:35
【问题描述】:
大家好,我是 android 新手,使用绿色 DAO 来管理数据库,但我经常遇到数据库未关闭异常,因为我在 Application onTeriminate() 中这样做,我在整个应用程序中只维护数据库的单个连接,但在某些情况下当我的应用程序进入后台并恢复数据库连接对象变为空时,我通过在使用前检查对象的空性来处理问题,但现在我经常收到异常
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(SQLiteOpenHelper.java:157) 01-03 09:39:18.688: E/SQLiteDatabase(3063): at com.google.android.apps.analytics.PersistentHitStore.loadExistingSession(未知来源) 01-03 09:39:18.688: E/SQLiteDatabase(3063): at com.google.android.apps.analytics.PersistentHitStore.(未知来源) 01-03 09:39:18.688: E/SQLiteDatabase(3063): at 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(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): 在 java.lang.reflect.Method.invokeNative(Native Method) 01-03 09:39:18.688: E/SQLiteDatabase(3063): 在 java.lang.reflect.Method.invoke(Method.java:511) 01-03 09:39:18.688: E/SQLiteDatabase(3063): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 01-03 09:39:18.688: E/SQLiteDatabase(3063): 在 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();
}
【问题讨论】:
-
请提供完整的堆栈跟踪和相关代码。
-
我已经更新了我的问题
-
检查您的堆栈跟踪。在我看来,这与您的应用或 greenDAO 无关。
标签: android android-sqlite greendao