2011-07-07 19 views
44

Stavo cercando un po 'di tempo per rispondere alla mia domanda, ma non ho ottenuto ciò di cui avevo bisogno. Ho un'applicazione con ListView e forma dove posso aggiungere un nuovo record al DB. Quindi non ci sono molte domande da fare.Il miglior posto per chiudere la connessione al database

Come gestire i collegamenti a db? Dovrei chiuderlo dopo aver ottenuto quello che voglio o dovrei tenerlo aperto tutto il tempo fino alla chiusura dell'app? Voglio sapere qual è il modo migliore mentre pensi alle prestazioni e alla durata della batteria.

+1

Grande spiegazione qui. Http://stackoverflow.com/questions/14002022/android-sq-lite-closed-exception/25379071#25379071 – Nepster

risposta

4

Stabilire la connessione al database è costoso. Se le connessioni non sono scarse e il database è locale, terrei aperta la connessione anziché stabilirla per ogni operazione di scrittura nel database, come faresti normalmente in un'applicazione client-server che deve ridimensionare ospitare un numero elevato di utenti simultanei.

+1

Sì, ho trovato che l'apertura potrebbe essere costoso. Quindi se ti capisco bene dovrei tenere aperta la connessione. Ma cosa succede se l'utente andrà alla schermata principale. Dovrei chiuderlo in onPause() e aprirlo di nuovo in onResume()? Come posso passarlo tra Intents? – Fixus

3

In generale, chiuderei la connessione nella funzione onDestroy() dell'attività che ha aperto la connessione. Chiuderei() un cursore da un database nella funzione che utilizza il cursore.

public MyActivity extends Activity{ 
    private myDatabase mDatabase; // myDatabase extends SQLiteOpenHelper 
    private Cursor mCursor; 

    public MyActivity(Context context){ 
     super(context); 
     initMemberVariables(); 
    } 

    public ElementButton(Context context, AttributeSet attrS){ 
    super(context, attrS); 
     initMemberVariables(); 
    } 

    public ElementButton(Context context, AttributeSet attrS, int defStyle){ 
     super(context, attrS, defStyle); 
     initMemberVariables(); 
    } 

    private void initMemberVariables(){ 
     mDatabase = new PSEdb(this.getContext()); 
    } 

    private void getData(){ 
     mCursor = mDatabase.MyGetterFunction(); 
     while(mCursor.moveToNext()){ 
      try{ 
       // populate your data 
      }catch(CursorIndexOutOfBoundsException ex){ 
       // handle the exception 
      } 
     } 
     mCursor.close(); 
    } 

    @Override 
    public void onDestroy(){ 
     super.onDestroy(); 
     mDatabase.close(); 
    } 
} 
94

Secondo this post by a Google engineer (Dianne Hackborn), non c'è niente di sbagliato con lasciando la connessione al database aperto:

Android ha preso una decisione di progettazione deliberata che è può sembrare sorprendente, ad appena rinunciare a l'intera idea di applicazioni uscire in modo pulito e invece lasciare che il kernel ripulire le loro risorse. Dopotutto, il kernel deve essere in grado di farlo comunque. Dato che il design, mantenere qualsiasi cosa aperto per tutta la durata della vita di un processo e mai chiuderlo non è semplicemente una perdita. Sarà ripulito quando il processo viene ripulito.

Così, per semplicità, vorrei estendere la classe Application per fornire un unico punto di ingresso ben definito per il codice e aprire la connessione al database nel suo onCreate(). Archiviare la connessione DB come campo nell'applicazione e fornire un metodo di accesso per rendere la connessione disponibile per il resto del codice.

Quindi, non preoccuparti di chiuderlo.

+2

Per la soluzione quik questa è una buona risposta, ma probabilmente questo può essere fatto meglio facendo un buon flusso del programma e prima di tutto la piallatura. –

+5

@ JānisGruzis come potrebbero essere le alternative "migliori" di qualcosa che funziona sempre ed è estremamente semplice? –

+2

L'apertura della connessione al database ben aperta sembra una cattiva pratica, anche se ha affermato che verrà chiusa dopo che l'applicazione è morta, non ho incontrato la descrizione di questo comportamento nei documenti Android e, in tal caso, ciò significa sempre più lavoro per Android (mantenendo connessioni e chiudendoli). Inoltre, ciò che accade se due applicazioni lavorano fianco a fianco (potrebbero funzionare nello stesso momento del servizio e dell'attività) e mantengono entrambe la connessione aperta. Ovviamente questo non è il caso e questo è il motivo per cui ho votato per questa soluzione. –

Problemi correlati