¿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?
- Android SimpleCursorAdapter no se actualiza cuando cambia la base de datos
- La aplicación se bloquea al iniciar Debido a java.lang.IllegalArgumentException: la columna '_id' no existe
- Cómo obtener datos de Cursor en ContextMenu
- Reemplazar la base de datos SQLite de aplicaciones mediante ADB
- ¿Cómo sincronizar los datos del servidor en la aplicación android?
- La aplicación no cerró el cursor o el objeto de base de datos que se abrió aquí:
- Cómo evitar objetos duplicados en la base de datos DB4o
- SQLite de Android usando db.query () para JOIN en lugar de rawquery ()
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 ();
- Android – ¿Cómo cambiar la altura de Recyclerview dinámicamente?
- Cómo agregar textos de intervalos en un buscador