2011-01-09 18 views
9

La documentación en http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#getWritableDatabase%28%29 estados:¿Dónde deberían las aplicaciones de Android llamar a SQLite getWritableDatabase?

actualización de base de datos puede tardar mucho tiempo, no debe llamar a este método [getWritableDatabase] desde el hilo principal aplicación, incluyendo de ContentProvider.onCreate().

Esto nos lleva a la pregunta: para la mejor práctica, ¿de dónde se debería llamar getWritableDatabase?

Mi sensación es que, tal vez, debería llamarse una vez que se inicia la aplicación con una devolución de llamada para marcar la base de datos como preparada. ¿Es esto correcto?

Respuesta

4

Para bases de datos pequeñas y ágiles, imagino que esto no es un gran problema.

De lo contrario, utilizaría un siempre maravilloso AsyncTask, llamado desde onCreate.

2

Se puede invocar desde cualquier lugar, pero no se debe invocar desde el hilo de la interfaz de usuario porque no se sabe cuánto tiempo llevará el proceso (especialmente con los diferentes sistemas de archivos en uso). Incluso si sabe que la base de datos debe ser pequeña, no conoce el sistema de archivos (¿puede realizar más de un trabajo a la vez? ¿Hay otros miles de trabajos esperando en línea?). Puede usar un AsyncTask o un Thread para llamar a getWriteableDatabase.

0

Parece que el uso previsto del marco de ayuda abierto es abrir el DB en el inicio de actividad y cerrarlo cuando se destruye la actividad.

En una AsyncTask desde dentro onCreate() ...

new StartupTask().execute(); 

El AsyncTask Thread.sleep() A continuación es solo para dar tiempo suficiente para mostrar el cuadro de diálogo para que pueda ver cómo funciona. Obviamente, sáquelo cuando termine de jugar. ;)

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

} 

en OnDestroy() ... openHelper.close();

Cuestiones relacionadas