我在复写onPase()和onDestroy()方法的时候,关闭了数据库和游标,会什么还是会出现这样的异常?不明白,求高人指点
01-03 07:54:23.978: E/SQLiteDatabase(1921): close() was never explicitly called on database '/data/data/com.englishcamp/databases/english.db' 
01-03 07:54:23.978: E/SQLiteDatabase(1921): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
01-03 07:54:23.978: E/SQLiteDatabase(1921):  at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1943)
01-03 07:54:23.978: E/SQLiteDatabase(1921):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1007)
01-03 07:54:23.978: E/SQLiteDatabase(1921):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:986)
01-03 07:54:23.978: E/SQLiteDatabase(1921):  at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1051)
01-03 07:54:23.978: E/SQLiteDatabase(1921):  at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:787)
01-03 07:54:23.978: E/SQLiteDatabase(1921):  at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)
01-03 07:54:23.978: E/SQLiteDatabase(1921):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:157)
01-03 07:54:23.978: E/SQLiteDatabase(1921):  at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:231)
01-03 07:54:23.978: E/SQLiteDatabase(1921):  at com.englishcamp.One.onCreate(One.java:80)
01-03 07:54:23.978: E/SQLiteDatabase(1921):  at android.app.Activity.performCreate(Activity.java:4465)
01-03 07:54:23.978: E/SQLiteDatabase(1921):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
01-03 07:54:23.978: E/SQLiteDatabase(1921):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
01-03 07:54:23.978: E/SQLiteDatabase(1921):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
01-03 07:54:23.978: E/SQLiteDatabase(1921):  at android.app.ActivityThread.access$600(ActivityThread.java:123)
01-03 07:54:23.978: E/SQLiteDatabase(1921):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
01-03 07:54:23.978: E/SQLiteDatabase(1921):  at android.os.Handler.dispatchMessage(Handler.java:99)
01-03 07:54:23.978: E/SQLiteDatabase(1921):  at android.os.Looper.loop(Looper.java:137)
01-03 07:54:23.978: E/SQLiteDatabase(1921):  at android.app.ActivityThread.main(ActivityThread.java:4424)
01-03 07:54:23.978: E/SQLiteDatabase(1921):  at java.lang.reflect.Method.invokeNative(Native Method)
01-03 07:54:23.978: E/SQLiteDatabase(1921):  at java.lang.reflect.Method.invoke(Method.java:511)
01-03 07:54:23.978: E/SQLiteDatabase(1921):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-03 07:54:23.978: E/SQLiteDatabase(1921):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-03 07:54:23.978: E/SQLiteDatabase(1921):  at dalvik.system.NativeStart.main(Native Method)
01-03 07:54:23.978: E/System(1921): Uncaught exception thrown by finalizer
01-03 07:54:23.988: E/System(1921): java.lang.IllegalStateException: Don't have database lock!
01-03 07:54:23.988: E/System(1921):  at android.database.sqlite.SQLiteDatabase.verifyLockOwner(SQLiteDatabase.java:2090)
01-03 07:54:23.988: E/System(1921):  at android.database.sqlite.SQLiteDatabase$1.entryRemoved(SQLiteDatabase.java:2182)
01-03 07:54:23.988: E/System(1921):  at android.database.sqlite.SQLiteDatabase$1.entryRemoved(SQLiteDatabase.java:2178)
01-03 07:54:23.988: E/System(1921):  at android.util.LruCache.trimToSize(LruCache.java:197)
01-03 07:54:23.988: E/System(1921):  at android.util.LruCache.evictAll(LruCache.java:285)
01-03 07:54:23.988: E/System(1921):  at android.database.sqlite.SQLiteDatabase.deallocCachedSqlStatements(SQLiteDatabase.java:2143)
01-03 07:54:23.988: E/System(1921):  at android.database.sqlite.SQLiteDatabase.closeClosable(SQLiteDatabase.java:1126)
01-03 07:54:23.988: E/System(1921):  at android.database.sqlite.SQLiteDatabase.finalize(SQLiteDatabase.java:1914)
01-03 07:54:23.988: E/System(1921):  at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:182)
01-03 07:54:23.988: E/System(1921):  at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:168)
01-03 07:54:23.988: E/System(1921):  at java.lang.Thread.run(Thread.java:856)

解决方案 »

  1.   

    难道你在运行的时候就没关闭过数据库?如果你只读一次数据库,关不关闭都可以,如果是多次读取,必须每次都要关闭,而不是等onPase()或onDestroy()才关闭。
      

  2.   

    问题解决了。
    有两个问题:
    首先:是在onPase()或onDestroy()方法中都没关闭数据库,也就是一直没有关闭数据库。由于整个程序的数据都是从数据库中现取现用,如果在运行过程中关闭数据库的话,会出现异常,故在onPase()或onDestroy()方法添加关闭数据库上述的一部分问题就解决了;
    另外:由于数据较大,如果用SQLiteDatabase直接读取的话,速度挺慢的,所以整个程序迟疑了2分钟,用数据库事务处理可以调高效率。
      

  3.   

    神马意思?没有看太懂,我用SimpleCursorAdapter,也在Ondestroy里关闭了,但是还是报错。