La finalizzazione di un Cursore che non è stata disattivata o chiuso non-fatale errore

sto diventando un “Finalizzazione di un Cursore che non è stata disattivata o
chiuso” errore su questo pezzo di codice.
Il codice è utilizzato per il riempimento di una listview.

Dal momento che è un errore non irreversibile , non c’è nessun crash e tutto sembra funzionare
bene..ma non mi piace l’errore.

Se chiudo il cursore alla fine di questo codice..listview soggiorno
vuoto.
se chiudo il cursore in onStop , ottengo lo stesso errore.

Come posso risolvere questo problema??

private void updateList() { 
        DBAdapter db = new DBAdapter(this); 
        db.open(); 
            //load all waiting alarm 
            mCursor=db.getTitles("state<2"); 
            setListAdapter(new MyCursorAdapter(this, mCursor)); 
            registerForContextMenu(getListView()); 
            db.close(); 
        } 


error : 


E/Cursor  ( 2318): Finalizing a Cursor that has not been deactivated 
or closed. database = /data/data/xxxxxxxxxxxxxxx.db, table = alerts, 
query = SELECT _id, alert_id, 
E/Cursor  ( 2318): 
android.database.sqlite.DatabaseObjectNotClosedException: Application 
did not close the cursor or database 
object that was opened here 
E/Cursor  ( 2318):      at 
android.database.sqlite.SQLiteCursor.<init>(SQLiteCursor.java:210) 
E/Cursor  ( 2318):      at 
android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDr­iver.java: 
53) 
E/Cursor  ( 2318):      at 
android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.j­ava: 
1345) 
E/Cursor  ( 2318):      at 
android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java­: 
1229) 
.... 
.... 
InformationsquelleAutor arnold | 2010-06-18

 

9 Replies
  1. 27

    Non si dovrebbe ottenere che il messaggio, se si chiude il Cursor in onStop() o onDestroy(). Si prega di provare di nuovo. Oppure chiamare startManagingCursor() dopo aver ottenuto il Cursor dalla query, e Android che permetterà di chiudere il Cursor sul proprio.

    • Grazie – startManaginCursor(mCursor) – Risolto…. L’errore si è verificato subito dopo l’avvio dell’attività..chiudendo così in onStop non sarebbe nemmeno essere chiamato prima l’errore. Grazie.
    • Forse stai pensando di sbagliato Cursor? Non c’è alcun motivo perché si dovrebbe ottenere che il messaggio “subito dopo l’avvio dell’attività”, così sto pensando che forse perde un Cursor all’attività precedente o qualcosa del genere.
    • utilizzare try catch e finally scrivere il codice del cursore.close() e il cursore.disattivare(); // solo se si desidera eseguire una query di archiviazione fase successiva altro cursore.close() è sufficiente. (cursore == null) anche a risolvere il problema
    • startManagingCursor(Cursore) è deprecato: “Utilizzare la nuova CursorLoader classe con LoaderManager, invece.”
    • So che questo è un vecchio thread, ma nessuno ha dichiarato l’ovvio. Lui è la creazione di un cursore e poi subito la chiusura del database senza chiudere il cursore. cursore.close() a destra prima di db.close() nell’esempio di codice dovrebbe risolvere il problema. Ecco perché accade quando l’attività viene creata.
  2. 13

    Scott,

    Mi sono imbattuto nello stesso problema come voi. Prima di chiudere il database, cioè “db.close(),” assicurarsi che i cursori sono chiuse, cioè “mCursor.close()”

    In questo modo:

    private void updateList()
    { 
        DBAdapter db = new DBAdapter(this);
        db.open();
    
        //load all waiting alarm
        mCursor=db.getTitles("state<2"); 
        setListAdapter(new MyCursorAdapter(this, mCursor)); 
        registerForContextMenu(getListView()); 
    
        //Let's close the cursor.
        mCursor.close();
        db.close(); 
    } 

    È detto che se hai chiuso il cursore vista lista rimane vuota. Mi consiglia di passare le informazioni oltre a una classe e copiare (allocare la memoria) quindi chiudere il cursore.

    • che cosa succede se io sono il ritorno cursore cursore personalizzato adattatore di creare una vista per me, c’è un modo per chiudere il cursore, quindi?
  3. 2

    Quando una query restituisce un cursore è posizionato effettivamente “prima”, il primo
    record del cursore. Un adattatore tentativo di fare un ‘getItem’ al primo
    elemento così si avrà esito negativo quando il cursore non è posizionato in qualsiasi.

    Nella mia base adattatori faccio un cursorMoveToPosition sul getViews. Questo sembra
    per eliminare la necessità per il movefirst.

    • Solo un ulteriore pensiero per @birdman: cursori probabilmente lavorato prima, soprattutto se si stesse utilizzando while(moveToNext). Poiché un cursore viene restituito prima del primo record il moveToNext opere.
  4. 1

    Non utilizzare startManagingCursor() dal momento che non è più l’approccio raccomandato. Il problema si verifica a causa di un cursore /connessione al DB non è ancora chiuso con il tempo il finalizzatore arriva a questo oggetto. Si può evitare che, da consentire un loader per gestire il mouse o il monitoraggio di tutti cursore /DB /SQLiteOpenHelper connessioni e pulizia dopo di loro.

    Si utilizza un Caricatore è abbastanza difficile e richiede un sacco di parti in movimento per funzionare in congiunzione con il dire una visualizzazione elenco. D’altra parte il monitoraggio del vostro cursore e le connessioni al database è incline all’errore umano. Se il numero di cursore /DB oggetti è basso, vi consiglio la seconda soluzione. Se no, esca un caricatore di gestire le connessioni.

  5. 1

    Chiudere il cursore oggetto, ovunque si sta creando.

    Quando si crea un oggetto cursore e fatto con attraversare una tabella SQLite poi chiudere dopo che è stato usato. Questa chiusura del cursore impedisce eccezione nel logcat.

    Non si otterrà alcuna eccezione relative a finalizzare il cursore a sinistra aperto.

    Fisso, stesso problema nella mia Applicazione.

  6. 0

    Ho lottato con questo problema per due giorni. Stavo cercando di ottenere il codice di esempio di lavoro che ha approvato una cursore, restituiti da una query di database, direttamente alla Scheda Elenco – non interim adattatore. Si rifiutò di lavoro visualizzata una schermata vuota, sino a quando ho richiamato ‘moveToFirst()’ il cursore prima di passarlo al ListAdapter. Vacci a capire! Quando io commento questo fuori, si rompe.

    Solo pensato che mi piacerebbe condividere questo per salvare le persone stesse lotte che ho avuto.

    Se qualcuno può far luce sul perché questo è così, lo apprezzerei. Non ho avuto per richiamare moveToFirst sui cursori fino ad ora, per arrivare a eseguire correttamente.

    • si dovrebbe usare startManagingCursor altrimenti si deve prendere cura del cursore io.e di chiusura, spostamento, ecc
  7. 0

    Appena avuto lo stesso problema e ho pensato di farvi sapere, nel caso in cui….

    Sbaglio ho chiamato il mio fetch routine due volte e con la presente “perso” il conseguente cursore della prima chiamata. Questo ha causato l’errore.

  8. 0

    Anch’io ho avuto problemi con la chiusura del cursore:

    • Chiudere il cursore a destra dopo aver impostato la visualizzazione elenco della scheda di causa il cursore per chiudere prima che i dati viene visualizzato.

    • Non è possibile utilizzare startManagingCursor per gestire il cursore perché è stato deprecato.

    • Il nuovo cursorLoader di ricambio per startManagingCursor sembra essere eccessivo.

    • Spostare la posizione del cursore come suggerito non funziona.

    • Rendendo il compito di una classe interna dell’attività e la chiusura il cursore nell’attività del metodo onDestroy a volte funziona, ma non tutto il tempo.

    • Rendendo il compito di una classe interna dell’attività e la chiusura il cursore nell’attività del metodo onStop sembra funzionare.

    Ho anche scoperto che posso chiudere il database e sqlite aprire helper prima di chiudere il cursore. Posso anche chiudere subito dopo l’impostazione della visualizzazione elenco dell’adattatore. I dati saranno ancora di visualizzazione.

    • cursorLoader è un’esagerazione, perchè hanno un dump di lavoro in più su di voi e meno su di loro

Lascia un commento