2013-07-24 14 views
13

Sto creando un'applicazione che crea molte interazioni con un database (operazioni di lettura e scrittura).Aprire correttamente/chiudere un database con il modello di progettazione Singleton

Per evitare le operazioni di apertura/chiusura a ogni richiesta, ho creato una classe che estende SQLiteOpenHelper con un modello di progettazione Singleton. In questo modo, sono sicuro che una sola istanza del SQLiteOpenHelper e una sola connessione al database viene effettuata durante tutto il ciclo di vita applicazione (e non solo attività del ciclo di vita).

Ho letto anche alcuni articoli su ContentProvider, ma non sono sicuro che sia un modo migliore.

Quindi, questa è la logica principale della mia classe Singleton (onCreate e onUpgrade rimosso):

public final class BaseSQLite extends SQLiteOpenHelper { 

    private static BaseSQLite mInstance = null; 

    private SQLiteDatabase db = null; 

    public static BaseSQLite getInstance(Context context) { 
     if (mInstance == null) { 
      mInstance = new BaseSQLite(context.getApplicationContext(), 
        DBNAME, DBVERSION); 
     } 
     return mInstance; 
    } 

    private BaseSQLite(final Context context, final String name, 
      final int version) { 
     super(context, name, null, version); 
     db = getWritableDatabase(); 
    } 

    @Override 
    public synchronized void close() { 
     if (mInstance != null) 
      db.close(); 
    } 

    public Cursor getAllData() { 
     String buildSQL = "SELECT * FROM myTable"; 

     return db.rawQuery(buildSQL, null); 
    } 

} 

Quindi, per accedere alla mia base di dati, ho fatto questo:

BaseSQLite baseSQLite = BaseSQLite.getInstance(context); 
baseSQLite.getAllData(); 

E ' funziona perfettamente per ora. Ma la mia domanda riguarda il metodo close(). Non so davvero quando chiamarlo. In realtà, la mia istanza di database è la stessa per tutte le Active della mia applicazione, quindi penso che sia una cattiva idea chiamare close() in un metodo onPause(), perché l'istanza sarà potenzialmente (e spesso accade) ricreata nel metodo onStart() della prossima attività. Inoltre, non riesco a rilevare il end della mia applicazione, vale a dire quando nessuna attività è visibile sullo schermo più.

Qualcuno può darmi un aiuto su questo problema? Ho trovato una risposta quando il database è collegato all'attività ONE, ma per il mio caso non viene fornito alcun suggerimento.

risposta

0

È necessario chiamare da vicino ogni volta che si è finito di scrivere nel database. Ad esempio quando si inseriscono dati, si avrà una connessione aperta al database che dovrebbe essere chiusa quando viene eseguita.

La lettura è diversa. Quando si crea un database SQLite sul telefono, i dati sono persistenti. Il database esiste e il gestore che crei fornisce un modo conveniente per accedere a tali informazioni. La lettura del database avviene di solito ottenendo un'istanza leggibile del database e utilizzando un valore Cursor per estrarre i valori. In tal caso chiudi il cursore quando hai finito, non il database stesso.

Hai ragione che non dovresti chiudere la connessione al database durante i metodi del ciclo di vita delle attività separate. Invece, come suggerito sopra, chiudi la connessione al database nei metodi del gestore che scrivono nel database quando hai finito di eseguire quella transazione.

+0

Ok, quindi devo rimuovere la riga 'db = getWritableDatabase()', e aggiungendo in ogni metodo 'getWritableDatabase()' o 'getReadableDatabase()'. Quindi, nel metodo di scrittura, ad esempio 'updateEntry (Object)', dovrei fare qualcosa del tipo: 'getWritableDatabase(); db.rawQuery (myRequestString, null); db.close() '? – mithrop

+0

se myRequestString è una posizione di inserimento - sì. [guarda questo esempio] (http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/) Non sto suggerendo di copiare esattamente ma puoi vedere come funziona la chiusura all'interno della transazione. Il modo in cui lo faccio è di avere un metodo nella classe del gestore db che esegue ciascuna funzione di scrittura, ad es. aggiungi la voce alla tabella. All'inizio di questo metodo ottengo un'istanza db scrivibile e quando la transazione è terminata la chiudo alla fine del metodo. – Rarw

+0

Ok. Sembra essere un'opzione davvero buona.Mi sono preoccupato per le performance che effettuavano molte chiamate di apertura/chiusura, ma a quanto pare non è davvero un problema :) – mithrop

Problemi correlati