¿Cuándo debo llamar a close () en SQLiteOpenHelper utilizado por ContentProvider
En mi aplicación android, uso SQLiteOpenHelper para implementar ContentProvider. Las operaciones de consulta, adición y eliminación se realizan a través de ContentProvider.
Pero en uno de mi teléfono Android (htc g13), encontré el archivo * .db-wal en directorio / datos / datos / [nombre del paquete] / bases de datos. Y el tamaño del archivo se incrementa muy rápido cuando se trabaja con ContentProvider. Ocupaba mucho espacio de RAM de usuario.
- SQLiteDatabase.openDatabase vs SQLiteOpenHelper.getReadableDatabase
- SQLiteOpenHelper sincronización
- Uso de una base de datos SQLite en Libgdx
- Android SQLiteException: Error al cambiar la configuración regional de db a 'en_US'
- ¿Es realmente necesario crear tablas SQLite cada vez que se inicia la aplicación?
Se recomienda cerrar el SQLiteOpenHelper para resolver mi problema (es útil) en la descripción de enlace de entrada de correo aquí .
Pero quiero encontrar un "lugar" para agregar el método "close ()" ya que no estoy usando SQLiteOpenHelper directamente (usando a través de ContentProvider). El método query () en ContentProvider debe devolver un Cursor y SQLiteDatabse debe permanecer en estado abierto.
Estoy confundido, ¿qué show hago ahora para mantener * .db-wal ido y usar ContentProvider normalmente?
- Java - java.lang.IllegalStateException: No se pudo leer la fila 0, col -1 de CursorWindow
- Error al insertar android.database.sqlite.sqliteconstraintexception error código 19 restricción fallida
- La mejor opción para almacenar nombre de usuario y contraseña en la aplicación Android
- Confundido sobre CursorLoaders y usarlos con un SQLiteOpenHelper personalizado
- Obtención de contexto en onCreate en SQLiteOpenHelper
- Cursor finalizado sin cerrar antes () Android
- Insertar datos JSON en la base de datos SQLite en android
- Cómo funciona SQLiteOpenHelper Context
El ingeniero de framework de Android se aferra a esta vista que necesita cerrar la base de datos.
Según Dianne Hackborn (Android Framework Engineer) en este hilo :
Un proveedor de contenido se crea cuando se crea su proceso de alojamiento y permanece durante todo el proceso, por lo que no es necesario cerrar la base de datos; se cerrará como parte del kernel que limpia los recursos del proceso cuando el Proceso es muerto.
Tiene un par de casos para cubrir:
1) Cuando termina su aplicación (p. Ej., Ingresando onDestroy ()) asegúrese de cerrar todos los Cursores, instancias de base de datos de SQLiteDatabase y SQLiteOpenHelpers (usando el modelo if (connection.isOpen ()) object.close ()
2) Cuando la aplicación se enciendePause () -> onResume () – use estas etapas apropiadamente para pausar / reanudar su conexión o para cerrarlas / abrirlas.
Es una buena práctica cerrar la base de datos inmediatamente después de terminar de trabajar con ella. La base de datos se almacena en caché, por lo que no hay problema al cerrarla y volver a adquirir la instancia de nuevo cuando la necesite con getWritableDatabase () / getReadableDatabase ()
Desde el documento oficial: "Una vez abierto correctamente, la base de datos se almacena en caché, por lo que puede llamar a este método cada vez que necesite escribir en la base de datos (Asegúrese de llamar a close () cuando ya no necesite la base de datos.
También tenga en cuenta que si SQLiteOpenHelper almacena en caché y realiza un seguimiento de todas las instancias abiertas de SQLiteDatabase, básicamente significa que si no deja conexiones de base de datos abiertas, no tendrá que llamar de cerca en SQLiteOpenHelper.
Recomiendo cerrar todos los cursores y bases de datos inmediatamente después de dejar de trabajar con ellos. Siempre trate de imponer try / catch / para las operaciones de consultas y finalmente bloquear para llamar a los métodos de cierre en los objetos.
- Problema al cargar vídeo flv en la vista web
- Detectar cuándo la reproducción de vídeo deja de reproducirse