SQLiteBlobTooBigException: строка слишком велика, чтобы поместиться в CursorWindow requiredPos = 0, totalRows = 1

Я получаю исключение ниже только в android 9, после переустановки все выглядит хорошо,

Исключение:

android.database.sqlite.SQLiteBlobTooBigException: Row too big to fit into CursorWindow requiredPos=0, totalRows=1...

Код:

Cursor cursor = database.query(......);
    if(cursor == null || cursor.getCount() < 0) { //Here is the error
        Log.d("Error", "count : null");
        return "";
    }

Отредактировано:

java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:354)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)

Caused by: android.database.sqlite.SQLiteBlobTooBigException: Row too big to fit into CursorWindow requiredPos=0, totalRows=1
at android.database.sqlite.SQLiteConnection.nativeExecuteForCursorWindow(Native Method)
at android.database.sqlite.SQLiteConnection.executeForCursorWindow(SQLiteConnection.java:859)
at android.database.sqlite.SQLiteSession.executeForCursorWindow(SQLiteSession.java:836)
at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:62)
at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:149)
at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:137)

Заранее спасибо, ребята


person Bikash Sahani    schedule 22.08.2018    source источник
comment
Можете ли вы отредактировать свой вопрос, чтобы показать полную трассировку стека, а не только одну строку из трассировки стека. Также может быть полезно добавить запрос.   -  person MikeT    schedule 22.08.2018
comment
я отредактировал свой ответ, проверьте один раз, @MikeT   -  person Bikash Sahani    schedule 22.08.2018
comment
ты нашел решение ?? У меня такое же исключение @Bikash Sahani.   -  person Nirmal Prajapat    schedule 01.10.2018
comment
это происходит, когда когда-либо кто-то обновляется до Oreo, не удаляя мое приложение, и продолжает его использовать, тогда возникает эта проблема, поэтому в это время я отбрасываю таблицу и создаю ее снова   -  person Bikash Sahani    schedule 31.10.2018
comment
у тебя есть какое-нибудь решение ??? У меня эта проблема возникает только в устройстве pocof1 android 9? после обновления до пирога при первой установке я получаю эту ошибку. после того, как я переустановил его работу нормально   -  person Aabauser    schedule 05.03.2019
comment
Есть какое-нибудь решение?   -  person gencaysahinn    schedule 11.03.2019


Ответы (4)


Попробуйте этот метод нового конструктора выше API 28. Возможно, вам следует установить ограниченное значение windowSizeBytes для CursorWindow и попробуйте поймать исключение.

Связанный код cts (https://android.googlesource.com/platform/cts/+/master/tests/tests/database/src/android/database/sqlite/cts/SQLiteCursorTest.java):

    public void testRowTooBig() {
        mDatabase.execSQL("CREATE TABLE Tst (Txt BLOB NOT NULL);");
        byte[] testArr = new byte[10000];
        Arrays.fill(testArr, (byte) 1);
        for (int i = 0; i < 10; i++) {
            mDatabase.execSQL("INSERT INTO Tst VALUES (?)", new Object[]{testArr});
        }
        // Now reduce window size, so that no rows can fit
        Cursor cursor = mDatabase.rawQuery("SELECT * FROM TST", null);
        CursorWindow cw = new CursorWindow("test", 5000);
        AbstractWindowedCursor ac = (AbstractWindowedCursor) cursor;
        ac.setWindow(cw);
        try {
            ac.moveToNext();
            fail("Exception is expected when row exceeds CursorWindow size");
        } catch (SQLiteBlobTooBigException expected) {
        }
    }

Другие:

Поскольку эта статья была изначально опубликована, мы добавили новые API в предварительную версию Android P для разработчиков, чтобы улучшить поведение, описанное выше. Платформа теперь позволяет приложениям отключать ⅓ эвристики окна и настраивать размер CursorWindow.

Ссылка: https://medium.com/androiddevelopers/large-database-queries-on-android-cb043ae626e8

person Sylvester Yao    schedule 24.04.2019

Попробуйте масштабировать растровое изображение:

Bitmap.createScaledBitmap
person Qiang Yao    schedule 25.03.2020

Это сработало для меня, вы должны поместить его в свою основную деятельность.

try {
    Field field = CursorWindow.class.getDeclaredField("sCursorWindowSize");
    field.setAccessible(true);
    field.set(null, 100 * 1024 * 1024); //the 100MB is the new size
    } catch (Exception e) {
       e.printStackTrace();
    }
person Enrique A    schedule 15.02.2021

Я нашел, как использовать length () и substr () для запроса только 1 МБ (максимум для CursorWindow составляет 2 МБ), возможно, это будет справка. Кроме того, вы можете использовать context.getContentResolver().query() с выбором, который включает только столбец _id, таким образом вы не будете загружать данные, относящиеся к другим столбцам.

person Dropin' Science    schedule 15.12.2019