Cómo debo abrir y cerrar mi base de datos correctamente
Tengo una aplicación que almacena algunos datos en un DB de SQLite.También estoy haciendo un montón de consulta una consulta en mi app.I tienen alrededor de 15 actividades en it.And almoust todos utilizan el DB para consultar los datos. Pero lo que estoy haciendo es abrir mi base de datos en cada actividad y cerrarla en onDestroy {…} de cada actividad.
El problema es que onDestroy {…} nunca se puede llamar y, a veces, mi aplicación permanece encendida durante mucho tiempo y pasar de una actividad a otra apertura para muchas veces mi base de datos.
- Forma preferida de actualizar sqlite db en android
- No se puede capturar Java (Android) Excepción con try-catch
- SQlite Obteniendo las ubicaciones más cercanas (con latitud y longitud)
- Recyclerview + Proveedor de contenido + CursorLoader
- ¿Por qué los Cursores Android comienzan antes de la primera fila de resultados y terminan después de la última fila?
Y a veces consigo errores como-base de datos muchas veces abierto y nunca cerrado.
Yo trataría de cerrar mi base de datos exactamente después de obtener mis datos de él y cerrarlo … pasar a mi próxima actividad y la reapertura y así sucesivamente ….. Pero el problema es que en algunas actividades vuelvo de Otras actividades … cerrando mi DB y volviendo a esa actividad produciría un gran cierre de la Fuerza.
Lo que quiero hacer es abrir mi base de datos al principio de mi aplicación y cerrarla al final de ella, pero estoy enfrentando 2 problemas:
1. ¿Debo hacer que mi clase de SQLiteOpenHelper sea un singleton? … obtener una instancia de la misma .. abrirla en mi primera actividad y luego en mis siguientes actividades sólo obtener una instancia de mi base de datos que ya está abierto / ???
2.¿Dónde está el final de mi aplicación ???? ¿Cómo debo saber dónde está el final de mi aplicación y dónde cerrar mi base de datos.
EDITAR:
public class DBAdapter extends SQLiteOpenHelper { public DBAdapter(Context context) { super(context, DATABASE_NAME, null, 1); this.myContext = context; } public void openDataBase() throws SQLException { String myPath = DATABASE_PATH + DATABASE_NAME; db = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); } }
Eso es un pedazo de código de mi clase que maneja mi DB.Para hacer este singleton debo usar un constructor como esto:
private DBAdapter() { //nothing in here }
Pero esto es indefinido para SQLiteOpenHelper
EDIT FINAL: Así es como lo hice de acuerdo con los consejos de zirael:
Paquete com.Server_1;
Import android.app.Application;
Public class MyApplication extends Aplicación {
private static DBAdapter db; public void onCreate() { db=new DBAdapter(getApplicationContext()); db.createDatabase(); db.openDataBase(); } public static DBAdapter getDatabaseAdapter() { return db; } }
En cada actividad en la que necesito una conexión de DB, hago esto:
MyApplication myApplication = (MyApplication) this.getApplication ();
DBAdapter db = myApplication.getDatabaseAdapter ();
Y finalmente mi manifiesto parece:
<application android:icon="@drawable/icon" android:label="@string/app_name" android:name=".MyApplication" android:debuggable="true">
- En GreenDao, genere una consulta de unión con OR en lugar de AND
- SQlite Selección de la tabla basada en el idioma
- Android ExpandableListView y base de datos SQLite
- SimpleCursorAdapter de Android con consultas utilizando DISTINCT
- El comodín no funciona en SQLite
- Capacidad máxima de almacenamiento de la base de datos SQLite
- Operador '! =' No se puede aplicar a los operandos de tipo 'Tarea' e 'int'
- ¿Por qué utilizar SQLiteOpenHelper sobre SQLiteDatabase?
En mi aplicación abra la conexión a la base de datos en la clase myApplication (su clase personalizada que extiende la aplicación – debe ser nombrado igual que su aplicación en androidManifest).
AndroidManifest.xml
<application android:label="@string/app_name" android:name="com.mypackage.MyApplication " android:debuggable="true">
MyApplication .java
public class MyApplication extends Application { private DatabaseAdapter dbAdapter; @Override public void onCreate() { dbAdapter = new DatabaseAdapter(getApplicationContext()); dbAdapter.open(); }
Y en cada clase que necesitan la conexión del DB simplemente uso:
MyApplication myApplication = (MyApplication) this.getApplication(); DatabaseAdapter dbAdapter= myApplication.getDatabaseAdapter();
MyApplication se ejecuta automáticamente en cada inicio de la aplicación. De esta manera sólo mantengo una conexión a DB por lo que se cierra cuando la aplicación se elimina de la memoria sin ningún problema.
Cuando recupere su dbAdapter de la clase MyApplication, hágalo de manera perezosa, creándolo sólo cuando sea necesario. En mi implementación, también lo abro en este momento.
public static DbAdapter getDbAdapter() { if (dbAdapter == null) { dbAdapter = new DbAdapter(); } dbAdapter.open(); return dbAdapter; }
Es una buena idea usar getReadableDatabase () o getWriteableDatabase () en el método abierto de su adaptador de base de datos.
Además, creo que funciona mejor para recuperar su adaptador en onStart () y cerrarlo en onStop () de las actividades en las que se está utilizando, en lugar de usar onCreate () y onDestroy ().
@Override protected void onStop() { super.onStop(); MyApp.closeDatabase(); }
Y en la clase MyApp …
public static void closeDatabase() { dbAdapter.close(); }
Si no gestiona su base de datos de acuerdo con las recomendaciones de Google, ¿por qué no? Generalmente hay una buena razón por la que las cosas son como son …
En cualquier caso, puede utilizar getReadableDatabase () y getWriteableDatabase () – estas funciones abrirán la base de datos si es necesario, pero devuelva el objeto de base de datos existente si ya está abierto, lo que impide que abra la base de datos varias veces.
Algo que podrías probar es usar un singleton al que cada actividad se enlazaría en su devolución de llamada onResume () y desvincularlo de su devolución de llamada onPause (). Cuando el recuento de separación llega a cero, establezca un temporizador que se cancelaría en el método de adjuntar. Si el temporizador caduca, cierre la base de datos.
Hay una buena respuesta de otra pregunta Mejor lugar para cerrar la conexión de base de datos
"Según este post de un ingeniero de Google, no hay nada malo en dejar abierta la conexión a la base de datos:
Android tomó una decisión de diseño deliberada que puede parecer sorprendente, simplemente renunciar a la idea de que las aplicaciones salen de forma limpia y, en su lugar, dejar que el núcleo limpie sus recursos. Después de todo, el núcleo debe ser capaz de hacer esto de todos modos. Dado que el diseño, mantener cualquier cosa abierta durante toda la duración de la vida de un proceso y nunca cerrarla simplemente no es una fuga. Se limpiará cuando se limpie el proceso.
Por lo tanto, para simplificar, extendería la clase Application para proporcionar un solo punto de entrada bien definido para su código, y abriría la conexión de base de datos en su onCreate (). Guarde la conexión de DB como un campo en su aplicación y proporcione un método de acceso para que la conexión esté disponible para el resto de su código.
Entonces, no te preocupes por cerrarla.
- ¿Cómo puedo llamar a una función de mi clase de actividad principal desde una vista personalizada de Galería en Android?
- GetSupportFragmentManager no compila en DialogFragment