Android SQL错误:由于未定义的语句而无法关闭

时间:2012-01-24 23:17:46

标签: android sqlite

我的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;
    }

在搜索互联网之后 - 似乎这个错误表明一个未封闭的游标 - 但上面的代码确保在关闭数据库之前必须关闭游标。

为什么我收到此错误的任何想法?

0 个答案:

没有答案