2011-03-27 20 views
5

Me preguntaba si alguien podría darme una breve descripción de los cursores de Android. Un par de preguntas específicas:SQLiteDatabases and Cursors

1 - Tengo un método que devuelve un cursor después de una consulta de base de datos:

public static Cursor getVehicles() 
{ 
    SQLiteDatabase db = vehicleData.getReadableDatabase(); 
    Cursor cursor = db.query(TABLE_NAME, GET_VEHICLES_FROM_CLAUSE, null, null, null, null, ORDER_BY); 

    return cursor; 
} 

Con el fin de hacer la limpieza, probé db.close() justo antes de la sentencia de retorno . Sin embargo, esto provocó que el cursor devuelto no contenga filas. ¿Por qué es esto?

2 - ¿Cuál es la diferencia entre cerrar un cursor y cerrar una base de datos?

3 - ¿Debo llamar al Cursor si es una variable local, o puedo dejar que el recolector de basura lo limpie?

4 - Mi base de datos es pequeña y solo la utilizo mi aplicación. ¿Puedo mantenerla abierta?

Respuesta

9

1) El cursor es solo un puntero a los datos devueltos por su consulta, no contiene todos los datos de su consulta. Esto es para aumentar el rendimiento/eficiencia (los grandes resultados no se leen a la vez -> menos memoria utilizada). Por lo tanto, si cierra la base de datos, el cursor no puede recuperar los datos -> está vacío.

2) Cuando cierra un cursor, se liberan todos los recursos asociados -> no puede acceder a los datos asociados con este cursor (desde que se ha liberado), pero puede realizar nuevas consultas utilizando este u otros cursores. Cuando cierra una base de datos, ya no puede consultarla (hasta que la vuelva a abrir).

3) Siempre cierre los cursores. De lo contrario, se encontrará con problemas: el GC se quejará si el cursor no está cerrado y las nuevas consultas están bloqueadas.

4) Si lo cierras cuando finaliza tu aplicación, sí.

+0

Gracias Alibi. Con respecto a 4, ¿hay alguna manera de detectar cuándo termina la aplicación? – barry

+0

Simplemente cierre el db cuando expiren sus actividades. Puedes usar el método onDestroy para eso. http://www.outofwhatbox.com/blog/2010/12/android-closing-those-database-objects/ – alibi

+0

Debería ser onPause() - la documentación dice que no podemos confiar en onDestroy() que se llama. – barry