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.
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
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
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