【问题标题】:How to know all open connections of data base using green DAO..?如何使用绿色 DAO 知道所有打开的数据库连接..?
【发布时间】: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


【解决方案1】:

您收到此异常“应用程序未关闭在此处打开的游标或数据库对象”,因为当您打开连接时,您需要在操作完成后关闭该游标。使用 db.close();完成任何操作后。

【讨论】:

  • 我正在维护一个连接并在应用程序 onTeriminate() 方法中关闭该连接
【解决方案2】:

我扩展了 Application 类(作为 theApp)并在那里打开和关闭数据库连接。然后我的所有活动都可以通过theApp.getInstance().daoSession() 访问数据库,而无需在活动暂停或完成时关闭数据库。当最后一个活动完成时,Android 将终止应用程序,这将关闭数据库连接。

【讨论】:

  • 应用程序 onTeriminate() 没有正确调用
猜你喜欢
  • 2014-12-31
  • 2012-01-29
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多