una tabla studio rawquery query movetonext mostrar example datos consultas android sqlite android-cursor

tabla - rawquery android



android java.lang.IllegalStateException: no se pudo leer la fila 0, col 0 desde CursorWindow (1)

01-29 13: 41: 56.520: W / CursorWindow (4121): la ventana está llena: asignación solicitada 5140987 bytes, espacio libre 2096617 bytes, tamaño de ventana 2097152 bytes

Android SQLite devuelve filas en ventanas de cursor que tienen el tamaño máximo de 2 MB especificado por config_cursorWindowSize . Si su fila excede este límite, obtendrá este error.

Almacenar datos grandes en la base de datos sqlite no es una buena idea de todos modos. Almacene archivos en el sistema de archivos y rutas en la base de datos.

Estoy desarrollando una aplicación que descarga algunos archivos y guarda su texto en el campo file_content en la base de datos. Los tamaños de archivo pueden variar de algunos KB a 10 MB. La aplicación funciona para todos los tamaños mientras se guarda. El problema ocurre cuando se utiliza la instrucción select en los registros largos de archivos_contenidos. Da

java.lang.IllegalStateException: no se pudo leer la fila 0, col 0 de CursorWindow

cuando busca esas filas ¿Hay algún límite en el tamaño del contenido del campo? Si es así, ¿por qué nos permite guardar y dar error al recuperar? Aquí está mi código recortado que trae la fila:

public String getFileContent(MyFile gc) { if(!isDBOpen()) { open(); } try { String mQuery = "SELECT * FROM " + DBOpenHelper.TABLE_SAVED_FILES + " WHERE " + DBOpenHelper.COLUMN_ID + " = " + gc.id; Cursor mCursor = database.rawQuery(mQuery, null); if(mCursor.getCount() <= 0) { return null; } if(mCursor.moveToFirst()) { return getCursorRowContent(mCursor); } } catch (Exception e) { e.getMessage(); } return null; } private String getCursorRowContent(Cursor mCursor) throws Exception { return mCursor.getString(mCursor.getColumnIndex(DBOpenHelper.COLUMN_FILE_CONTENT)); }

¿Alguna idea de lo que está pasando? Lo he probado en 2 o 3 dispositivos.

Salida de Logcat:

01-29 13:41:56.520: W/CursorWindow(4121): Window is full: requested allocation 5140987 bytes, free space 2096617 bytes, window size 2097152 bytes 01-29 13:41:56.520: E/CursorWindow(4121): Failed to read row 0, column 0 from a CursorWindow which has 0 rows, 9 columns. 01-29 13:43:30.932: W/System.err(4121): java.lang.IllegalStateException: Couldn''t read row 0, col 0 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. 01-29 13:43:30.932: W/System.err(4121): at android.database.CursorWindow.nativeGetLong(Native Method) 01-29 13:43:30.932: W/System.err(4121): at android.database.CursorWindow.getLong(CursorWindow.java:507) 01-29 13:43:30.932: W/System.err(4121): at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:75) 01-29 13:43:30.936: W/System.err(4121): at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:220) 01-29 13:43:30.936: W/System.err(4121): at android.database.AbstractCursor.moveToNext(AbstractCursor.java:245) 01-29 13:43:30.940: W/System.err(4121): at com.nxb.cachehead.bl.PocketQueryDataSource.getGeoCacheContent(PocketQueryDataSource.java:97) 01-29 13:43:30.940: W/System.err(4121): at com.nxb.cachehead.bl.GPXFileCopyAsyncTask.doInBackground(GPXFileCopyAsyncTask.java:27) 01-29 13:43:30.940: W/System.err(4121): at com.nxb.cachehead.bl.GPXFileCopyAsyncTask.doInBackground(GPXFileCopyAsyncTask.java:1) 01-29 13:43:30.940: W/System.err(4121): at android.os.AsyncTask$2.call(AsyncTask.java:287) 01-29 13:43:30.944: W/System.err(4121): at java.util.concurrent.FutureTask.run(FutureTask.java:234) 01-29 13:43:30.944: W/System.err(4121): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 01-29 13:43:30.948: W/System.err(4121): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 01-29 13:43:30.948: W/System.err(4121): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 01-29 13:43:30.948: W/System.err(4121): at java.lang.Thread.run(Thread.java:856)