usar studio recorrer objeto from example data consultas como clase android cursor

studio - ¿Qué significa "declaración inválida en fillWindow()" en el cursor de Android?



objeto cursor android (5)

A veces veo este error en mi salida de logcat ,

Cursor: invalid statement in fillWindow().

A veces sucede cuando presiono la tecla de retroceso y luego va a la vista de lista predeterminada de Android antes de ir a mi lista de vista personalizada.

Qué significa eso? ¿Cómo lo soluciono? Porque no apunta a ninguna línea de código de donde viene el problema.


Cuando se trata de ListActivities, este problema tiene que ver con los objetos Cursor, los objetos CursorAdapter y los objetos de la base de datos que no se cierran correctamente cuando se detiene la actividad y no se configuran correctamente cuando la actividad comienza o se reanuda.

Tenía que asegurarme de haber cerrado mi SimpleListAdapter, mis Cursores y luego mis objetos de la Base de Datos en el orden respectivo, en el método onStop de la Actividad que se llama cuando se reanuda TabActivity.

Ya había estado cerrando los objetos del Cursor y de la Base de Datos, pero no había estado cerrando mi Cursor Adaptador SimpleList.

/** * onStop method * * Perform actions when the Activity is hidden from view * * @return void * */ @Override protected void onStop() { try { super.onStop(); if (this.mySimpleListAdapterObj !=null){ this.mySimpleListAdapterObj.getCursor().close(); this.mySimpleListAdapterObj= null; } if (this.mActivityListCursorObj != null) { this.mActivityListCursorObj.close(); } if (this.myDatabaseClassObj != null) { this.myDatabaseClassObj.close(); } } catch (Exception error) { /** Error Handler Code **/ }// end try/catch (Exception error) }// end onStop


Es de suma importancia que cierre los cursores, bases de datos, DBHelpers en el orden correcto.

por ejemplo, para el código dado a continuación.

DBHelper dbhelper = new DBHelper(); SQLiteDataBase db = dbhelper.getWritableDatabase(); Cursor c = db.query(/*some parameters*/);

el orden de cierre debería ser como:

c.close(); db.close(); dbhelper.close();

De lo contrario, diferentes errores continúan generando y el desarrollador ni siquiera llega a saberlo. "Cursor: instrucción inválida en fillWindow ()" es uno de esos errores.


Si está utilizando una instancia de clase personalizada, por ejemplo, el Model m que contiene un DatabaseManager , que a su vez contiene una SQLiteDatabase : SQLiteDatabase > DatabaseManager-> SQLiteDatabase

Luego, si haces una consulta a m (que hace las delegaciones apropiadas) y luego haces algo como m.close() (que en realidad cierra la base de datos SQLiteDatabase ) y después de eso intentas usar el Cursor, obtendrás ese error.

La solución es: primero use el cursor y luego cierre el Db.

Mi respuesta se basa en los 2 existentes hasta el momento, que me inspiró a resolver el problema.


Tal vez esto pueda ayudarlo: http://www.ragtag.info/2011/feb/1/database-pitfalls/

Parece que las llamadas a getReadableDatabase y getWritableDatabase devuelven la misma conexión a la base de datos (incluso si usted les hizo varias llamadas). Entonces, cualquier llamada a close () en cualquiera de ellos cerrará ambas conexiones.

Si intenta utilizar un cursor más adelante, obtendrá la bonita ''Declaración inválida'', ya que la conexión en la que se basa el cursor ya está cerrada.


Todavía tengo problemas con el error ''Invalid statement in fillWindow ()''.

Reduje el problema al cursor SimpleCursorAdapter para mi ListView.

Por ejemplo, si estoy en la vista de lista para una Actividad A, y cierro el cursor antes de comenzar una nueva Actividad B, no obtengo la ''Declaración inválida en fillWindow ()'' cuando regreso a la Actividad A.

Sin embargo, antes de que se cargue la Actividad B, veo que la lista de la vista de lista de la Actividad A desaparece de la pantalla y aparece brevemente el mensaje "No se encontraron registros" antes de que se oculte la pantalla, antes de que se muestre la pantalla de la Actividad B.

¿Cómo puedo resolver con gracia este problema?

EDITAR: De hecho, me di cuenta de esto esta mañana. yo añadí

this.stopManagingCursor(this.myListCursor);

al método onPause en mis clases ListActivity, y eso resolvió el error ''Invalid statement in fillWindow ()''.