I am getting below exception only in android 9, after reinstalling everything looks good,
Exception:
android.database.sqlite.SQLiteBlobTooBigException: Row too big to fit into CursorWindow requiredPos=0, totalRows=1...
Code:
Cursor cursor = database.query(......);
if(cursor == null || cursor.getCount() < 0) { //Here is the error
Log.d("Error", "count : null");
return "";
}
Edited:
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)
Thanks in advance guys
Try this new constructor method above API 28. Maybe you should set a limited windowSizeBytes for CursorWindow and try-catch the exception.
Related cts code (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) {
}
}
Others:
Since this article was originally published, we’ve added new APIs in the Android P developer preview to improve the behavior above. The platform now allows apps to disable the ⅓ of a window heuristic and configure CursorWindow size.
Ref Link: https://medium.com/androiddevelopers/large-database-queries-on-android-cb043ae626e8