¿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.

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?

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.

  • Cómo insertar a granel en sqlite en android
  • SQLiteOpenHelper - ¿Cómo se crea la base de datos?
  • ¿Cuál es la manera más rápida de analizar una cadena JSON en una tabla SQLite?
  • Error al leer la fila 0, columna 0 de una CursorWindow que tiene 0 filas, 64 columnas
  • GetReadableDatabase a menudo, pero no siempre devuelve null
  • Abra / cierre correctamente una base de datos con el patrón de diseño Singleton
  • cómo crear base de datos una sola vez, a continuación, leer y escribir varias veces desde él, SQLite, OpenHelper, Android
  • Android SqliteAssetHelper - fusionar las tablas de la base de datos del activo con el existente
  • SQLiteOpenHelper "onCreate" no se llama? (El DB no existe)
  • SQLiteOpenHelper vs ContentProvider
  • Android obtener la imagen de disco de base de datos es malformado (código 11) error
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.