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.

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 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 eliminar tablas y bases de datos con Sqiltehelper en android
  • Cómo insertar a granel de Json a Sqlite en Android
  • Consultar tabla con subclases-como las relaciones
  • ¿JSON en un campo del sqlite?
  • La base de datos Android está dañada, pero puede abrirse en SQLite Manager. ¿Recuperable?
  • Android - cómo utilizar "select last_insert_rowid ();"
  • Intent.ACTION_PICK devuelve el cursor vacío para algunos contactos
  • Descargar la base de datos SQLite desde Internet y cargarla en la aplicación de Android
  • Android: SQL rawQuery con comodín (%)
  • Android / ORMLite Insertar fila con ID
  • Cómo eliminar todos los elementos de SQLite en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.