2012-04-12 24 views
5

Panoramica: l'apertura delle connessioni db nelle attività onStart e async è diventata piuttosto complessa. È una cattiva pratica avere connessioni db globalmente disponibili? Se è male, cos'è un modo migliore?Android quando dovrei aprire e chiudere le connessioni db?

Dettagli: Ho un'applicazione che si collega al database sqlite3 in diverse attività. All'inizio non c'erano molti posti in cui avevo bisogno di accedere al database, quindi mi stavo solo aprendo e chiudendo ogni volta che avevo bisogno di accesso. Poi c'erano più posti che dovevano accedervi così, come suggerito in un'altra domanda di Stack Overflow, ho iniziato ad aprire le connessioni al database nel metodo onStart dell'attività che aveva bisogno di una connessione e chiudendolo nel metodo onStop.

Questo ha funzionato fino a quando non ho iniziato a richiedere le connessioni in alcune attività asincrone che sono sopravvissute all'attività. Poiché il metodo onStop per l'attività era stato chiamato e le connessioni erano state chiuse, nel momento in cui l'attività asincrona tentava di accedere al database non funzionava. Come soluzione ho creato connessioni separate per ogni attività asincrona che sono state aperte nel metodo onPreExecute e chiuse nel metodo onPostExecute.

Ciò ha comportato un sacco di apertura e chiusura delle connessioni e mi chiedo se la creazione di connessioni db disponibili globalmente nel contesto dell'applicazione sia una buona idea. Pulirebbe sicuramente molto codice e rimuoverà ogni eccezione db non chiusa che si sta verificando se dimentico di chiudere una connessione o se l'app subisce una chiusura forzata. Qualcun altro ha provato questo/vede qualche problema con questo approccio?

+0

Questa è una buona pratica, fallo. Il problema principale da evitare è la perdita di memoria dall'uso del contesto dell'applicazione, che non dovrebbe essere un problema se è solo per le operazioni del database. – stealthcopter

risposta

2

Mi sono imbattuto in problemi simili alcune settimane fa. Io uso diverse classi che hanno persistenza in un db SQLite.

Come volevo disgiungere le attività dalla persistenza, ho creato classi interne statiche (chiamate Gestori) per coloro che hanno bisogno di persistenza. Ogni volta che istanzia un Manager, viene creata una connessione db e dopo averlo utilizzato lo chiudo esplicitamente. Se avessi i global manager per accedere alle tabelle, dovrebbero essere sincronizzati a causa della concorrenza e non so quando chiudere le connessioni db. Così l'ho fatto in questo modo.

Spero che questo aiuti!

+0

Grazie, non stavo pensando al problema della concorrenza, questo è quello che stavo cercando. – odiggity

+0

Prego! Felice di aiutare! :) – Caumons

2

È possibile creare un BaseAsyncTask i cui onPreExecute() e onPostExecute() sono responsabili dell'apertura e della chiusura delle connessioni db.

AsyncTasks può estendere la chiamata di baseAsyncTask super.onPreExecute() e super.onPostExecute() ed eseguire il caricamento effettivo dei dati nel metodo doInBackground().

+0

Dovevo accettare l'altra risposta in quanto rispondeva meglio alla mia domanda, ma lo farò sicuramente anche io. Grazie! – odiggity

Problemi correlati