我的android代码中出现以下错误:
01-25 12:09:41.035: E/Database(6825): sqlite3_close(0x2305c0) failed: 5
01-25 12:09:41.055: E/XXXX (6825): INVALID TERMINATION while processing Resource Request: android.database.sqlite.SQLiteException: unable to close due to unfinalised statements
01-25 12:09:41.055: E/XXXX (6825): at android.database.sqlite.SQLiteDatabase.dbclose(Native Method)
01-25 12:09:41.055: E/XXXX (6825): at android.database.sqlite.SQLiteDatabase.onAllReferencesReleased(SQLiteDatabase.java:320)
01-25 12:09:41.055: E/XXXX (6825): at android.database.sqlite.SQLiteDatabase.close(SQLiteDatabase.java:891)
01-25 12:09:41.055: E/XXXX (6825): at com.xxx.xxx.database.DatabaseTableManager.closeDB(DatabaseTableManager.java:171)
01-25 12:09:41.055: E/XXXX (6825): at com.xxx.xxx.database.DatabaseTableManager.endQuery(DatabaseTableManager.java:227)
01-25 12:09:41.055: E/XXXX (6825): at com.xxx.xxx.database.DatabaseTableManager.query(DatabaseTableManager.java:109)
.
.
.
错误发生在我为管理数据库调用而创建的类中。问题的方法是:
public ArrayList<ContentValues> query(String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) {
ArrayList<ContentValues> result = new ArrayList<ContentValues>();
int count = 0;
if (Constants.debugDatabaseManager && Constants.LOG_DEBUG) Log.println(Constants.LOGD,TAG,"DB: "+this.getTableName()+" query:");
if (Constants.debugDatabaseManager && Constants.LOG_VERBOSE) printStackTraceInfo(Log.VERBOSE);
beginReadQuery(); //This method just opens the DB
Cursor c = db.query(getTableName(), columns, selection, selectionArgs, groupBy, having, orderBy);
try {
if (c.getCount() > 0) {
for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
result.add(new ContentValues());
DatabaseUtils.cursorRowToContentValues(c, result.get(count++));
}
}
}
catch( Exception e ) {
Log.e(TAG,Log.getStackTraceString(e));
}
finally {
if ( c != null ) c.close();
while (c!=null) { //Adding this while loop has reduced the frequency of the errors
if (c.isClosed()) c = null;
try { Thread.sleep(10); } catch (Exception e) {}
}
}
endQuery(); //this method just closes the db
return result;
}
在搜索互联网之后 - 似乎这个错误表明一个未封闭的游标 - 但上面的代码确保在关闭数据库之前必须关闭游标。
为什么我收到此错误的任何想法?