Domanda

sembra il modo consigliato da Google (utilizzando la libreria di supporto Android) per un frammento o attività di interagire con un database SQLite è tramite un caricatore che si estende AsyncTaskLoader e funziona in modo simile al modo in cui CursorLoader fa per ContentProviders.

Una singola attività o frammento possono interagire con un database in una varietà di modi, aggiornamento, la cancellazione e dati interrogazione in una o più tabelle. Ma poiché una pala ha un solo posto in cui effettuare la manipolazione di database (cioè in loadInBackground()), è lo sviluppatore dovrebbe scrivere un caricatore separato per ciascun tipo di interazione, soprattutto perché sembra che l'unico modo per parametrizzare il comportamento in loadInBackground() è passando argomenti al costruttore della pala tramite l'argomento args a LoaderManager.initLoader()?

Grazie molto.

È stato utile?

Soluzione

Quando non si utilizza un ContentProvider, vale a dire quando si utilizza SQLite direttamente, uso AsyncTaskLoader se l'insieme delle operazioni di database da eseguire restituisce un Cursor. Il set può includere qualsiasi tipo di operazione - aggiornamento, interrogare, eliminare, inserire. Queste operazioni devono essere eseguite in AsyncTaskLoader.loadInBackground().

Se l'insieme delle operazioni di database non si traduca in un Cursor essere restituito, utilizzare un AsyncTask. In questo caso, le operazioni devono essere eseguite in AsyncTask.doInBackground().

Altri suggerimenti

Ci sono due principali vantaggi di utilizzare un CursorLoader nella vostra applicazione su Activity.managedQuery():

  1. La query viene gestito su un thread in background per voi (per gentile concessione di essere generazione su AsyncTaskLoader) così grande query di dati non bloccano l'interfaccia utente. Questo è qualcosa che la documentazione raccomanda di fare per voi stessi quando si utilizza un Cursor semplice, ma ormai è fatta sotto il cofano.
  2. CursorLoader è auto-aggiornamento. Oltre a eseguire la query iniziale, il CursorLoader registra un ContentObserver con il set di dati che avete richiesto e le chiamate forceLoad() su se stessa quando il set di dati cambia. Questo si traduce in voi ottenere callback async in qualsiasi momento le modifiche dei dati, al fine di aggiornare la vista.

Ogni istanza Loader viene gestita anche attraverso il singolare LoaderManager, quindi ancora non è necessario gestire direttamente il cursore, e ora il collegamento può persistere anche oltre una singola Activity. LoaderManager.initLoader() e LoaderManager.restartLoader() consentono di ristabilire il contatto con un caricatore esistente già impostato per la query e, in alcuni casi, immediatamente ottenere i dati più recenti, se è disponibile.

La vostra attività o Frammento probabilmente ora implementare l'interfaccia LoaderManager.Callback. Chiamando initLoader() si tradurrà nel metodo onCreateLoader (), dove potrete costruire la query e una nuova istanza CursorLoader, se necessario. Il metodo onLoadFinished() verrà licenziato ogni volta che sono disponibili nuovi dati, e comprenderà l'ultimo cursore per di allegare alla vista o in altro modo Scorrere.

In aggiunta, c'è una buona abbastanza esempio di tutto questo raccordo insieme sulla pagina di documentazione di classe LoaderManager: http://developer.android.com/reference/android/app/LoaderManager.html

Speranza che aiuta!

In base alle risposte precedenti, non sono sicuro se questo è quello che stai chiedendo esattamente. Ma sì, bisogna fare un caricatore con il suo ID univoco per ogni set di dati vale a dire ogni tipo di query che si esegue.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top