2010-11-08 20 views
31

Tengo una aplicación que utiliza el cursor para seleccionar datos a través de rawQuery desde un db sqlite para llenar un ListView en Android ;. Cada vez que el usuario hace clic en un elemento de vista de lista, creo una nueva instancia de actividad para volver a llenar la vista de lista. ¿Es mejor llamar al cursor.close() y al db.close() para evitar problemas de memoria? De hecho tengo db.close() en OnDestroy() de mi actividad.Cuándo cerrar el cursor en Android?

+0

tal vez esto podría ayudar a http://stackoverflow.com/questions/8532427/how-do-i-close-the -cursor-and-database-safe – Majid

Respuesta

22

Puede cerrar el cursor una vez que haya recuperado los valores para ese objeto particular dentro de su método.

btw ... No tiene que volver a crear un listview para un evento de clic de usuario. Simplemente notifique que hay algún cambio en los datos de su adaptador que se ha establecido en la vista de lista.

Algo así como

youradaptername.notifyDataSetChanged(); 

Esto debe repoblar contenidos dentro ur listview automáticamente.

+0

dónde agregar esta línea youradaptername.notifyDataSetChanged() ;? oncreate() o setitemclicklistener? – Metalhead1247

+0

notifyDataSetChanged() debe llamarse en un punto en el que sepa que los datos en su adaptador han cambiado. Esto obligará a la vista de lista a volver a dibujar sus vistas, lo que a su vez lo ayudará a ver los datos nuevos en la lista. A dónde va a invocar notifyDataSetChanged() depende de su necesidad. Ejemplo refiérase a thispost http://stackoverflow.com/questions/16441298/android-call-notifydatasetchanged-from-asynctask – DeRagan

6

Bueno, si está creando una nueva instancia cada vez de la misma actividad (aunque no estoy seguro de que sea una buena práctica de programación). Puede cerrar el cursor tan pronto como haya terminado de recorrer/iterar a través del origen de la vista de lista.

Ejemplo:

una implementación de ejemplo sería algo así como

//Pre cursor code 
startManagingCursor(cursor); 
if (cursor.moveToFirst()) { 
    do { 
     if (cursor.getString(0).equals(value)) { 
      cursor.close(); 
      a = true; 
      return a; 
     } 
    } while (cursor.moveToNext()); 
} 

//Close cursor here, when its work is complete 
cursor.close(); 

//Post cursor code ... 
+7

Siempre es una buena práctica ajustar su cursor.close() en una cláusula finally. De esta forma, se asegura de que el cursor esté cerrado, sin importar si se lanza una RuntimeException durante el procesamiento. – schnatterer