Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


No se pudo asignar CursorWindow

Estoy operando en una base de datos SQLite3 en mi aplicación android. Acabo de leer de la base de datos pre poblada que tiene 200k filas y 14 columnas. Las entradas son palabras. El tipo de datos de todas las columnas es texto. Consultar palabras de hasta 11 letras (por ejemplo, ABANDONO) funciona bien. Pero para 12 o más (por ejemplo, ABANDONAMIENTOS), la aplicación se bloquea. Aquí está el logcat:

Could not allocate CursorWindow '//data//data//com.example.myapp//databases//database.sqlite' of size 2097152 due to error -12. threadid=11: thread exiting with uncaught exception (group=0x40adf9f0) FATAL EXCEPTION: Thread-2883 android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=861 (# cursors opened by this proc=861) at android.database.CursorWindow.<init>(CursorWindow.java:104) at android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:198) at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:162) at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:156) at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:161) at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:201) at com.example.myapp.MainActivity.query(MainActivity.java:815) at com.example.myapp.MainActivity$2.run(MainActivity.java:356) at java.lang.Thread.run(Thread.java:856) 

código:

 query = "select * from words where col_1 = \"" + (myWord)+ "\";"; cursor = database.rawQuery(query, null); if (cursor != null) cursor.moveToFirst(); // line 815 if (!cursor.isAfterLast()) { do { for (i = 1; i < cursor.getColumnCount(); i++) { temp = cursor.getString(i); //other stuff } } while (cursor.moveToNext()); cursor.close(); } 

Entonces, ¿qué significa el error y por qué se está estrellando la aplicación?

  • Android, cómo ejecutar un archivo sql en sqlitedatabase
  • Android Sqlite - "No hay tal tabla" Error
  • Qué son los tipos de datos en SQLite que soportan android
  • SQLiteOpenHelper - ¿Cómo se crea la base de datos?
  • Android: actualizar la versión de la base de datos y agregar nueva tabla
  • Modo offline de la aplicación android, sincronización local de la base de datos sqlite con la base de datos distante
  • Cambiar el número de versión de la base de datos SQLite
  • ¿Cómo puedo leer mi base de datos de DDMS
  • 3 Solutions collect form web for “No se pudo asignar CursorWindow”

    Error -12 significa fuga de cursor. Pls intente cerrarlo como sigue:

     try {....} finally { cursor.close();} 

    Yo estaba preguntando en un bucle. Y cerrar el cursor dentro del bucle y no fuera resolvió el problema.

    Los cursores de Android leen todos los resultados de la consulta en la memoria y tienen un límite de 1 MB para esos datos.

    Este límite se eligió porque esta cantidad de datos es probable que haga que su aplicación se ejecute lentamente en un dispositivo móvil.

    Usted debe, si es posible:

    • Hacer los cálculos no en su código, pero en SQL;
    • Consulta sólo los datos que necesita (es decir, no utilice SELECT * pero obtenga sólo las columnas que necesita y utilice un filtro WHERE );
    • Leer los datos en porciones más pequeñas.
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.