Android SQLiteDatabase运行异常logcat处理问题

Android 码拜 6年前 (2015-05-11) 479次浏览 0个评论
 

我在复写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)

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

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

一次性读取的数据较多,前面的虽然有异常,可是程序并没有停止,而是停了2分钟左右才有反应的,运行的时候关闭了数据库也是一样的异常。

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

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

我都改了,但还是不行,求帮忙解决~~
http://bbs.csdn.net/topics/391023998?page=1#post-399143774


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Android SQLiteDatabase运行异常logcat处理问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!