2010-11-08 10 views
31

Ho un'app che utilizza il cursore per selezionare i dati tramite rawQuery da un db sqlite per popolare un oggetto ListView in Android ;. Ogni volta che l'utente fa clic su un oggetto listview creo una nuova istanza di attività per ri-popolare listview. È meglio chiamare cursor.close() e db.close() per evitare problemi di memoria? In realtà ho db.close() in OnDestroy() della mia attività.Quando chiudere il cursore in Android?

+0

forse questo potrebbe aiutare http://stackoverflow.com/questions/8532427/how-do-i-close-the -cursore-e-database-sicuro – Majid

risposta

22

È possibile chiudere cursor dopo aver recuperato i valori per quell'oggetto particolare all'interno del metodo.

btw ... Non è necessario ricreare uno listview ogni volta per un evento click dell'utente. Basta notificare che ci sono dei cambiamenti nei dati dell'adattatore che è stato impostato in listview.

Qualcosa di simile

youradaptername.notifyDataSetChanged(); 

Questo dovrebbe ripopolare contenuti all'interno ur listview automaticamente.

+0

dove aggiungere questa riga youradaptername.notifyDataSetChanged() ;? oncreate() o setitemclicklistener? – Metalhead1247

+0

notifyDataSetChanged() deve essere chiamato in un punto in cui si sa che i dati nell'adattatore sono cambiati. Questo costringerà la listview a ridisegnare le sue viste che a sua volta ti aiuteranno a vedere i nuovi dati nella lista. Dove stai andando a invocare notifyDataSetChanged() dipende dalle tue necessità. Esempio di riferimento a questo indirizzo http://stackoverflow.com/questions/16441298/android-call-notifydatasetchanged-from-asynctask – DeRagan

6

Bene se si sta creando una nuova istanza ogni volta che si svolge la stessa attività (anche se non sono sicuro che sia una buona pratica di programmazione). Puoi chiudere il cursore non appena hai finito di attraversare/iterare attraverso la sorgente della listview.

Esempio:

Un esempio di implementazione sarebbe qualcosa di simile

//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

È sempre buona norma avvolgere il cursore.close() in una clausola finally. In questo modo si assicura che il cursore sia chiuso, indipendentemente dal fatto che durante l'elaborazione venga generata una RuntimeException. – schnatterer

Problemi correlati