2010-10-10 23 views
10

Qual è il modo migliore per condividere un DB SQLite tra più attività? Le tabelle da DB sono mostrate in ListView e anche l'eliminazione/inserimento di record deve essere eseguita. Ho sentito parlare dei Servizi, ma non ho trovato esempi per il mio problema. Ora ho la classe SQLiteOpenHelper per aprire DB. Chiudo db in OnPause() e lo apro in onResume(). Ma non posso inserire dati in db da sottoattività, smth va storto.Database SQLite Android condiviso tra le attività

risposta

20

Creare una classe di applicazione per l'app. Rimarrà attivo in memoria fino a quando una parte della tua app è in esecuzione. È possibile creare il DB dal metodo onCreate e pulirlo nel metodo onTerminate. (Si noti che non vi è alcuna garanzia che venga chiamato onTerminate, quindi è necessario prestare attenzione a cosa si dipende qui. Tuttavia, dal momento che un database SQLite è solo un file e viene arrossato in modo aggressivo, l'operazione di chiusura è una cortesia più che necessità.)

È possibile accedere all'applicazione da qualsiasi attività tramite "getApplication", in modo che il DB sia sempre disponibile.

Per ulteriori informazioni, vedere http://developer.android.com/guide/appendix/faq/framework.html#3.

Aggiornamento:

Come richiesto, ecco un esempio di utilizzo getApplication. È davvero incredibilmente semplice.

SQLiteDatabase mDB; 
    @Override protected void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mDB = ((MyApplication)getApplication()).mDB; 
    } 

Se ogni attività comprende questo codice, quindi ogni attività avrà un proprio campo di MDB che fa riferimento allo stesso oggetto DB condiviso sottostante.

+0

Quindi, qualsiasi attività sarà in grado di leggere/scrivere dati senza conflitti? Potresti mostrare qualche esempio per getApplication() metod? –

+1

Tutte le attività, i servizi, ecc. Utilizzano lo stesso thread di eventi, quindi non c'è alcun rischio di problemi di sincronizzazione. È necessario utilizzare "startManagingCursor" per tutti i cursori che si utilizzano per gli adattatori all'interno delle attività in modo che vengano disattivati ​​e richiesti quando si passa da un'attività all'altra. – beekeeper

+0

Sostituire SQLiteDatabase con SQLiteOpenHelper sarà OK? –

3

si potrebbe fare questo l'implementazione di una classe di BaseActivity ciò che viene prorogato di tutte le classi di attività nell'applicazione:

public class BaseActivity extends Activity { 

    protected static SQLiteOpenHelper database; 

    @Override 
    protected void onPause() { 

      // TODO close database 

      super.onPause(); 
    } 

    @Override 
    protected void onResume() { 

      super.onResume(); 

      // TODO open database 
    } 
} 




public class OneSubActitivy extends BaseActivity { 

    // methods using database from BaseActivity 
} 
+0

Qual è la differenza tra implementare l'attività di base e implementare onResume e onPause per ciascuna attività? –

+0

È necessario implementare solo una volta il codice in BaseActivity. Devi scrivere il codice comune per tutte le attività nella classe base ... – caligari

Problemi correlati