¿Cuál es el uso de moveToFirst () en los cursores de SQLite?

Soy un novato de progtwigción y encontré esta pieza de código en Internet y funciona bien

Cursor c=db.query(DataBase.TB_NAME, new String[] {DataBase.KEY_ROWID,DataBase.KEY_RATE}, DataBase.KEY_ROWID+"= 1", null, null, null, null); if(c!=null) { c.moveToFirst(); } 

pero no puedo entender el uso del

 if(c!=null) { c.moveToFirst(); } 

parte. ¿Qué hace exactamente, y si elimino el

 if(c!=null) { c.moveToFirst(); } 

parte, el código no funciona.

Los documentos para SQLiteDatabase.query () dicen que los métodos de consulta devuelven:

“Un objeto Cursor, que está posicionado antes de la primera entrada”.

Llamar a moveToFirst() hace dos cosas: le permite probar si la consulta devolvió un conjunto vacío (probando el valor de retorno) y mueve el cursor al primer resultado (cuando el conjunto no está vacío). Tenga en cuenta que para protegerse contra un conjunto de devolución vacío, el código que ha publicado debe probar el valor de devolución (que no está haciendo).

A diferencia de la llamada a moveToFirst() , la prueba para if(c!=null) es inútil; query() devolverá un objeto Cursor o arrojará una excepción. Nunca regresará null .

 if (c.moveToFirst()) { while(!c.isAfterLast()) { // If you use c.moveToNext() here, you will bypass the first row, which is WRONG ... c.moveToNext(); } } 

El cursor no es una Fila del resultado de la consulta. Cursor es un objeto que puede iterar en las filas de resultados de su consulta. El cursor puede moverse a cada fila. .moveToFirst() método .moveToFirst() mueve a la primera fila de la tabla de resultados.

El método moveToFirst () mueve el cursor a la primera fila. Permite realizar una prueba de si la consulta devolvió un conjunto vacío o no. Aquí hay una muestra de su implementación,

 if (cursor.getCount() == 0 || !cursor.moveToFirst()) { return cursor.getLong(cursor.getColumnIndexOrThrow(ID_COLUMN)); cursor.close(); 

¡Qué macio.Jun dice que está bien!

tenemos código como a continuación:

  String sql = "select id,title,url,singer,view,info from cache where id=" + id; SQLiteDatabase db = getMaintainer().getReadableDatabase(); Cursor query = db.rawQuery(sql, null); query.moveToFirst(); while(query.moveToNext()){ DBMusicData entity = new DBMusicData(); entity.setId(query.getString(query.getColumnIndex(FIELD_ID))); entity.setTitle(query.getString(query.getColumnIndex(FIELD_TITLE))); entity.setSinger(query.getString(query.getColumnIndex(FIELD_SINGER))); entity.setTitlepic(query.getString(query.getColumnIndex(FIELD_PICURL))); entity.setInfoUrl(query.getString(query.getColumnIndex(FIELD_INFO))); entity.setViews(query.getString(query.getColumnIndex(FIELD_VIEW))); Log.w(tag, "cache:"+ entity.toString()); } query.close(); query=null; db.close(); db=null; 

Si solo tenemos un registro en la tabla de caché, query.moveToFirst (); hará que no regrese ningún registro.