2011-01-09 11 views
9

La documentazione a http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#getWritableDatabase%28%29 stati:Dove dovrebbero le applicazioni Android chiamare SQLite getWritableDatabase?

aggiornamento del database può richiedere molto tempo, non si deve chiamare questo metodo [getWritableDatabase] dal thread principale applicazione, compreso da ContentProvider.onCreate().

Questo solleva la domanda: per le migliori pratiche, da dove dovrebbe essere richiamatoWritableDatabase?

La mia sensazione è che, forse, dovrebbe essere chiamato una volta all'avvio dell'applicazione con un callback per contrassegnare il database come pronto. È corretto?

risposta

4

Per database piccoli e agili, immagino che questo non sia un gran problema.

Altrimenti, userei un sempre meraviglioso AsyncTask, chiamato da onCreate.

2

Può essere chiamato da qualsiasi luogo, ma non deve essere chiamato dal thread dell'interfaccia utente perché non si sa quanto tempo impiegherà il processo (specialmente con i diversi file system in uso). Anche se si sa che il database dovrebbe essere piccolo, non si conosce il file system (può eseguire più di un lavoro alla volta? Ci sono migliaia di altri lavori in attesa già in linea?). È possibile utilizzare AsyncTask o Thread per chiamare getWriteableDatabase.

0

Sembra che l'uso previsto del framework di helper aperto sia quello di aprire il db all'avvio dell'attività e chiuderlo quando l'attività viene distrutta.

In un AsyncTask dall'interno onCreate() ...

new StartupTask().execute(); 

L'AsyncTask Thread.sleep() di seguito è solo per dare il tempo sufficiente per mostrare la finestra di dialogo in modo che si può vedere il lavoro. Ovviamente prendilo quando hai finito di giocare. ;)

private class StartupTask extends AsyncTask 
{ 

    private ProgressDialog progressDialog; 

    @Override 
    protected Object doInBackground(final Object... objects) 
    { 
     openHelperRef.getWritableDatabase(); 
     try 
     { 
      Thread.sleep(5000); 
     } 
     catch (InterruptedException e) 
     { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPreExecute() 
    { 
     super.onPreExecute(); 
     runOnUiThread(new Runnable() 
     { 
      public void run() 
      { 
       progressDialog = ProgressDialog.show(
        MyActivity.this, "Title", 
        "Opening/Upgrading the database, please wait", true); 
      } 
     }); 
    } 

    @Override 
    protected void onPostExecute(Object object) 
    { 
     super.onPostExecute(object); 
     progressDialog.dismiss(); 
    } 

} 

in OnDestroy() ... openHelper.close();

Problemi correlati