2011-03-07 39 views
7

Tengo un ListView que muestra datos de una base de datos sqlite. Extendí CursorAdapter para hacer esto. El código siguiente en mi ListActivity tiene un gran problema: que las manos de encima el cursor a la CursorAdapterProblema de pérdida de Android SQlite con CursorAdapter

private boolean refreshListView() { 
    final boolean result; 
    SqliteHelper sqliteHelper = new SqliteHelper(this); 
    sqliteHelper.open(); 
    final Cursor cursor = sqliteHelper.fetchAll(); 
    if (cursor.getCount() == 0) { 
     //handling some stuff 
    } else { 
     startManagingCursor(cursor); 
     final MyCursorAdapter measures = new MyCursorAdapter(this, cursor); 
     setListAdapter(measures); 
     result = true; 
    }   
    return result; 
} 

me di cuenta que este código conduce a frecuentes IllegalStateExceptions "SQLiteDatabase creado y nunca cerrado".

Intenté solucionar esto cerrando la conexión de la base de datos. Pero si lo cierro con este método, obtengo el SQLiteMisuseException, y supongo que esto se debe a que el Adaptador todavía está en funcionamiento y aún se necesita el cursor.

También intenté cerrar la base de datos de onPause(). Sin embargo, esto no soluciona la fuga.

No quiero una aplicación que produzca ningún tipo de memoria u otra fuga. Pero no tengo idea de lo que estoy haciendo mal. No he encontrado ninguna devolución de llamada o métodos de ciclo de vida en ListActivity o CursorAdapter que me dieron una pista de cómo debo manejar esto.

Agradecería cualquier sugerencia sobre cómo solucionar esto. Estoy empezando a sospechar que todo el constructo está simplemente equivocado. Puedo publicar más código si es necesario.

Respuesta

9

Debe llamar al sqliteHelper.open() en onCreate() y sqliteHelper.close() en onDestroy().

Activity Lifecycle explica el ciclo de vida en detalle.

+2

Gracias, al principio no parecía funcionar pero luego resultó que había cometido el mismo error en otra clase. No tengo idea de por qué nunca probé en Destroy(). Siempre asumí que OnPause() sería el mejor lugar, me enseña a leer en lugar de asumir cosas. – Yashima