2012-02-03 11 views
6
SQLiteOpenHelper dbOpenHelper = new (ctx, nameofdb); 
SQLiteDatabase db = dbOpener.getWritableDatabase(); 

¿Tengo que llamar .close() en ambos, o sólo uno de ellos es suficiente? Si es así, ¿cuál?¿Debo llamar .close() en tanto SQLiteDatabase y SQLiteOpenHelper

SQLiteDatabase 
SQLiteOpenHelper 

El problema que estoy teniendo es que no veo una fila en particular en vista DDMS en Eclipse, pero cuando se utiliza el cursor para conseguirlo, se nota que tengo esa entrada. ¿Entonces me pregunto si podría ser causado por no cerrar la base de datos correctamente? Cualquiera que pueda ayudar sería genial. ¡Gracias!

Respuesta

5

Si nos fijamos en los documentos de SQLiteOpenHelper.close() ...

pública sincronizado vacío estrecha()

Cerrar cualquier objeto de base de datos abierta.

No cierra el SQLiteOpenHelper, cierra la base de datos.

Además de esto, si obtiene el código correcto, puede evitar tratar directamente con el objeto de la base de datos directamente.

Por ejemplo, si tiene una consulta que utiliza regularmente para obtener un cursor para un adaptador para poblar una vista, cree un método en su clase SQLiteOpenHelper y coloque la consulta en eso.

En otras palabras, no obtenga una referencia de la base de datos real en su código principal simplemente obtenga el SQLiteOpenHelper para hacer todo por usted.

+1

¿Qué pasa con [Principio de responsabilidad única] (http://en.wikipedia.org/wiki/Single_responsibility_principle)? Pensé que la clase 'SQLiteOpenHelper' solo usa [para ayudar] a abrir (para crear \ actualizar) una base de datos. –

+0

@LeonidSemyonov: Podría argumentarse que simplemente extender cualquier clase y agregar funcionalidad (nuevos métodos o implementando interfaces) agrega responsabilidades adicionales de todos modos ... pero hacerlo es un principio fundamental de OOD/OOP. No es raro en Android crear una clase DB 'ayudante' genérica que a su vez mantiene un 'SQLiteOpenHelper'. Mi punto es en ciertos casos, 'SQLiteOpenHelper' se puede extender para proporcionar * TODOS * los métodos de DB 'ayudante' en lugar de tener un DB 'ayudante' POJO separado. – Squonk

+0

@Squonk no 'cierra ningún objeto de base de datos abierto' implica que cerrará todas las instancias de SqliteDatabase abiertas en la aplicación (suponiendo que haya varias abiertas) o solo cierra las que están vinculadas al objeto SqliteOpenHelper actual? – aandis

Cuestiones relacionadas