2011-01-09 16 views
9

Die vorliegende Dokumentation http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#getWritableDatabase%28%29 heißt es:Wohin sollen Android-Anwendungen SQLite getWritableDatabase aufrufen?

Datenbank-Upgrade eine lange Zeit in Anspruch nehmen kann, Sie diese Methode nicht nennen sollte [getWritableDatabase] aus dem Anwendung Hauptthread, einschließlich von ContentProvider.onCreate().

Dies wirft die Frage auf: für Best Practice, woher sollte manWorthDatenbank aufgerufen werden?

Mein Gefühl ist, dass es vielleicht einmal nach dem Start der Anwendung mit einem Rückruf aufgerufen werden sollte, um die Datenbank als bereit zu markieren. Ist das richtig?

Antwort

4

Für kleine und agile Datenbanken kann ich mir vorstellen, dass dies kein großes Problem ist.

Ansonsten würde ich eine immer-wunderbare AsyncTask, von onCreate genannt.

2

Es kann von überall aufgerufen werden, aber es sollte nicht aus dem UInthread aufgerufen werden, da Sie nicht wissen, wie lange der Prozess dauern wird (besonders bei den verschiedenen verwendeten Dateisystemen). Selbst wenn Sie wissen, dass die Datenbank klein sein sollte, wissen Sie nichts über das Dateisystem (kann es mehr als einen Job gleichzeitig ausführen? Gibt es tausend andere Jobs, die bereits in der Warteschlange sind?). Sie können eine AsyncTask oder eine Thread verwenden, um getWriteableDatabase aufzurufen.

0

Es scheint, dass die beabsichtigte Verwendung des geöffneten Hilfeframeworks darin besteht, den db beim Start der Aktivität zu öffnen und ihn zu schließen, wenn die Aktivität zerstört wird.

In einem AsyncTask aus onCreate() ...

new StartupTask().execute(); 

Die AsyncTask Thread.sleep() unten ist gerade genug Zeit zu geben, um den Dialog zu zeigen, so dass Sie es arbeiten sehen. Nimm das natürlich heraus, wenn du fertig bist. ;)

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();