SQLite
 sql >> Database >  >> RDS >> SQLite

Android:tenta di riaprire un oggetto già chiuso:SQLiteQuery utilizzando loaderManager

Il tuo codice è un po' difficile da capire a causa della scarsa formattazione.

Ad ogni modo, la risposta fornita in realtà non è una soluzione. Il cursore è tornato su onLoadFinished dovrebbe essere garantito che non venga chiuso, quindi stai caricando il cursore nel modo sbagliato. In particolare, quando chiami

adapter.getFilter().filter(s.toString());

Non capisco davvero cosa succede qui, ma capisco che dovresti fare qualcos'altro. Basta memorizzare il filtro della query in un campo all'interno del tuo Fragment ed esegui getLoaderManager().restartLoader(DRINKS_LIST_LOADER, null, this); . Nota che esegui restartLoader e non initLoader , perché disponi di dati diversi per i quali desideri eseguire una query.

Nel tuo onCreateLoader , dovresti usare il filtro che hai memorizzato come variabile di istanza per la selection .

Un po' di background

initLoader carica i dati che sono stati caricati nell'ultima esecuzione, se erano stati eseguiti in precedenza. Questo è il motivo per cui richiami il metodo di inizializzazione del tuo frammento/attività. Questo è utile perché non dovrai richiedere il cambio di orientamento.

restartLoader pulisce i dati caricati in precedenza in modo da ottenere un nuovo Loader per lavorare con (probabilmente) dati diversi.

Se non sei ancora sicuro di quello che stai facendo, assicurati di leggere questo articolo, che è un ottimo articolo introduttivo sui caricatori con codice di esempio che assomiglia molto a quello che vuoi ottenere. All'inizio i caricatori sono piuttosto enigmatici, ma una volta presa la mano, la navigazione è tranquilla.