当前位置: 代码迷 >> Android >> SQLiteDatabase抛出异常的有关问题~求大神帮解决~
  详细解决方案

SQLiteDatabase抛出异常的有关问题~求大神帮解决~

热度:27   发布时间:2016-04-28 00:58:19.0
SQLiteDatabase抛出错误的问题~~求大神帮解决~~!
本帖最后由 u010781408 于 2015-04-25 12:39:59 编辑
04-25 04:30:00.520: E/SQLiteDatabase(4404): close() was never explicitly called on database '/data/data/com.android.accounts.acticity/databases/account.db' 
04-25 04:30:00.520: E/SQLiteDatabase(4404): close() was never explicitly called on database '/data/data/com.android.accounts.acticity/databases/account.db' 
04-25 04:30:00.520: E/SQLiteDatabase(4404): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
04-25 04:30:00.520: E/SQLiteDatabase(4404):  at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1943)
04-25 04:30:00.520: E/SQLiteDatabase(4404):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1007)
04-25 04:30:00.520: E/SQLiteDatabase(4404):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:986)
04-25 04:30:00.520: E/SQLiteDatabase(4404):  at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1051)
04-25 04:30:00.520: E/SQLiteDatabase(4404):  at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:770)
04-25 04:30:00.520: E/SQLiteDatabase(4404):  at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)
04-25 04:30:00.520: E/SQLiteDatabase(4404):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:157)
04-25 04:30:00.520: E/SQLiteDatabase(4404):  at com.android.accounts.dao.PwdDAO.getCount(PwdDAO.java:58)
04-25 04:30:00.520: E/SQLiteDatabase(4404):  at com.android.accounts.acticity.Login$1.onClick(Login.java:36)
04-25 04:30:00.520: E/SQLiteDatabase(4404):  at android.view.View.performClick(View.java:3511)
04-25 04:30:00.520: E/SQLiteDatabase(4404):  at android.view.View$PerformClick.run(View.java:14105)
04-25 04:30:00.520: E/SQLiteDatabase(4404):  at android.os.Handler.handleCallback(Handler.java:605)
04-25 04:30:00.520: E/SQLiteDatabase(4404):  at android.os.Handler.dispatchMessage(Handler.java:92)
04-25 04:30:00.520: E/SQLiteDatabase(4404):  at android.os.Looper.loop(Looper.java:137)
04-25 04:30:00.520: E/SQLiteDatabase(4404):  at android.app.ActivityThread.main(ActivityThread.java:4424)
04-25 04:30:00.520: E/SQLiteDatabase(4404):  at java.lang.reflect.Method.invokeNative(Native Method)
04-25 04:30:00.520: E/SQLiteDatabase(4404):  at java.lang.reflect.Method.invoke(Method.java:511)
04-25 04:30:00.520: E/SQLiteDatabase(4404):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
04-25 04:30:00.520: E/SQLiteDatabase(4404):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
04-25 04:30:00.520: E/SQLiteDatabase(4404):  at dalvik.system.NativeStart.main(Native Method)
04-25 04:30:00.552: E/System(4404): Uncaught exception thrown by finalizer
04-25 04:30:00.580: E/System(4404): java.lang.IllegalStateException: Don't have database lock!
04-25 04:30:00.580: E/System(4404):  at android.database.sqlite.SQLiteDatabase.verifyLockOwner(SQLiteDatabase.java:2090)
04-25 04:30:00.580: E/System(4404):  at android.database.sqlite.SQLiteDatabase$1.entryRemoved(SQLiteDatabase.java:2182)
04-25 04:30:00.580: E/System(4404):  at android.database.sqlite.SQLiteDatabase$1.entryRemoved(SQLiteDatabase.java:2178)
04-25 04:30:00.580: E/System(4404):  at android.util.LruCache.trimToSize(LruCache.java:197)
04-25 04:30:00.580: E/System(4404):  at android.util.LruCache.evictAll(LruCache.java:285)
04-25 04:30:00.580: E/System(4404):  at android.database.sqlite.SQLiteDatabase.deallocCachedSqlStatements(SQLiteDatabase.java:2143)
04-25 04:30:00.580: E/System(4404):  at android.database.sqlite.SQLiteDatabase.closeClosable(SQLiteDatabase.java:1126)
04-25 04:30:00.580: E/System(4404):  at android.database.sqlite.SQLiteDatabase.finalize(SQLiteDatabase.java:1914)
04-25 04:30:00.580: E/System(4404):  at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:182)
04-25 04:30:00.580: E/System(4404):  at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:168)
04-25 04:30:00.580: E/System(4404):  at java.lang.Thread.run(Thread.java:856)

前两天运行还是没问题的,然后突然间就报错了~~~~百度了很久,就在所有的有关于cursor、DBOpenHelper和SQLiteDatabase的函数中加上了
if (!cursor.isClosed()) {  
    cursor.close();  
}  
db.close();  

例如在pwdDao的getCount()函数,
public long getCount() {
db = helper.getWritableDatabase();// 初始化SQLiteDatabase对象
Cursor cursor = db.rawQuery("select count(password) from tb_pwd", null);// 获取密码信息的记录数
if (cursor.moveToNext())// 判断Cursor中是否有数据
{
return cursor.getLong(0);// 返回总记录数
}
if (!cursor.isClosed()) {  
    cursor.close();  
}  
db.close();  
return 0;// 如果没有数据,则返回0
}

但还是不行。究竟是什么问题,该怎样解决呢?求大神帮忙!~~
------解决思路----------------------
你查询出来总记录数后,方法return出去了,下面代码不执行,所以数据库没有close。你在return之前调用close方法或者activity的ondestory()调用