¿Dónde deben llamar las aplicaciones de Android a SQLite getWritableDatabase?

La documentación en http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#getWritableDatabase%28%29 indica:

La actualización de la base de datos puede tardar mucho tiempo, no debería llamar a este método [getWritableDatabase] desde el subproceso principal de la aplicación, incluido ContentProvider.onCreate ().

Esto plantea la pregunta: para las mejores prácticas, ¿de dónde se debe getWritableDatabase ser llamado?

Mi opinión es que, tal vez, debe ser llamado una vez que el lanzamiento de la aplicación con una devolución de llamada para marcar la base de datos como listo. ¿Es esto correcto?

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

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

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

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

En un AsyncTask desde onCreate () …

 new StartupTask().execute(); 

El AsyncTask Thread.sleep () a continuación es sólo para dar tiempo suficiente para mostrar el diálogo para que pueda verlo funcionar. Obviamente, quita eso cuando termines 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 ();

  • ¿Cómo funciona un cursor SQLite trabajar internamente?
  • Manera correcta de manejar Bidireccional 1: m en Green-DAO
  • Razones para utilizar la base de datos SQLite legible
  • SQLite de Android que elimina una fila específica de la base de datos
  • El grupo de conexiones no ha podido conceder una conexión a subproceso
  • Ordenar los datos de la base de datos y mostrarlos en la vista de lista
  • Android: Cierre de la base de datos SQLite
  • ¿Puedo almacenar de forma segura una cadena totalmente aleatoria (cualquier valor de 16 bits) en un SQLiteDB?
  • Android cómo obtener datos sqlite por nombre de columna
  • Crear tabla adicional en SQLITE existente (sin pérdida de datos)
  • SQLite de SQL INSERT o REPLACE
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.