代码之家  ›  专栏  ›  技术社区  ›  hari86

Android:CursorWindowAllocationException-即使在关闭光标时

  •  1
  • hari86  · 技术社区  · 8 年前

    即使在关闭光标之后,我也会遇到上述异常。

    下面是我的代码

    public Cursor fetchAllFreeGradeNr(String grade) {
            open();
            String query;
                query = "SELECT DISTINCT " + C_GRADE + "," + C_GRADE_NR + ""
                        + " FROM '" + TABLE_NAME_PAID + "'" + " WHERE " + C_GRADE
                        + " = '" + grade + "'  ORDER BY " + C_GRADE_NR + " ASC";
    
                Cursor mCursor = mDb.rawQuery(query, null);
                if (mCursor != null) {
                    mCursor.moveToNext();
                }
                close();
                return mCursor;
        }
    

    撞车发生在线路上 mCursor.moveToNext();

    下面是我的日志

    03-31 12:27:42.433: E/AndroidRuntime(25885): android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=631 (# cursors opened by this proc=631)
    03-31 12:27:42.433: E/AndroidRuntime(25885):    at android.database.CursorWindow.<init>(CursorWindow.java:108)
    03-31 12:27:42.433: E/AndroidRuntime(25885):    at android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:198)
    03-31 12:27:42.433: E/AndroidRuntime(25885):    at android.database.sqlite.SQLiteCursor.clearOrCreateWindow(SQLiteCursor.java:316)
    03-31 12:27:42.433: E/AndroidRuntime(25885):    at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:142)
    03-31 12:27:42.433: E/AndroidRuntime(25885):    at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:136)
    03-31 12:27:42.433: E/AndroidRuntime(25885):    at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:197)
    03-31 12:27:42.433: E/AndroidRuntime(25885):    at android.database.AbstractCursor.moveToNext(AbstractCursor.java:245)
    03-31 12:27:42.433: E/AndroidRuntime(25885):    at com.tss.in.database.ISOFitsProvider.fetchAllFreeGradeNr(ISProvider.java:151)
    

    也尝试如下

    public Cursor fetchAllFreeGradeNr(String grade) {
            //Cursor mCursor ;
            open();
            String query;
                query = "SELECT DISTINCT " + C_GRADE + "," + C_GRADE_NR + ""
                        + " FROM '" + TABLE_NAME_PAID + "'" + " WHERE " + C_GRADE
                        + " = '" + grade + "'  ORDER BY " + C_GRADE_NR + " ASC";
            Cursor cursor = null;
            try {
                cursor = mDb.rawQuery(query, null);
                if (cursor != null) {
                    return cursor;
                }
            } catch (Exception e) {
                if (cursor != null) {
                    cursor.close();
                }
            }
    
            return cursor;
    }
    

    上述代码也会导致崩溃。

    2 回复  |  直到 8 年前
        1
  •  1
  •   user5703518 user5703518    8 年前

    你应该在完成游标后关闭它,我的意思是,当你从中获取数据并填充模型时,你必须关闭它,所以你的方法可能是:

    public Cursor fetchAllFreeGradeNr(String grade) {
            open();
            String query;
                query = "SELECT DISTINCT " + C_GRADE + "," + C_GRADE_NR + ""
                        + " FROM '" + TABLE_NAME_PAID + "'" + " WHERE " + C_GRADE
                        + " = '" + grade + "'  ORDER BY " + C_GRADE_NR + " ASC";
    
                Cursor mCursor = mDb.rawQuery(query, null);
                return mCursor;
        }
    

    那么在另一种方法中,例如,你会得到这样的结果:

       if (cursor != null && cursor.getCount() > 0) {
            cursor.moveToFirst();
            do {
                //... retrieve data
            } while (cursor.moveToNext());
        }
    
        if(cursor != null) cursor.close();
    
        2
  •  0
  •   Yasir Tahir    8 年前

    导致此错误的最常见原因是非闭合游标。确保使用光标后关闭所有光标

    if(mCursor!= null) mCursor.close();