2012-09-16 66 views
16

Yo soy muy novato de programación y me encontré con este pedazo de código en el Internet y que funciona bien¿Cuál es el uso de moveToFirst() en SQLite cursores

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 soy capaz de entender el uso de la

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

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

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

parte, el código no funciona.

Respuesta

50

la documentación para SQLiteDatabase.query() dicen que los métodos de consulta regresan:

"Un objeto Cursor, que se coloca 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 devolverá null.

+0

genial, gracias también me dicen el funcionamiento de '' si – Aswin

+2

@Aswin (c! = Null) - Hecho. La prueba para 'null' es inútil. Puede mover la llamada a 'moveToFirst()' fuera del 'if' y deshacerse de' if'. –

+0

Buena explicación para el cursor y su manejo de errores – Zoombie

0

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 moverlo a la primera fila de la tabla de resultados.

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

lo que macio.Jun says is right!

tenemos un 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 tenemos un solo registro de la tabla de caché, query.moveToFirst(); hará que no regrese ningún registro.

+0

Compruebe el error lógico: Si cursor.moveToNext devuelve verdadero, entonces está en el primer registro. Al llamar a moveToNext se saltará su primera fila a la siguiente fila y nunca se accederá a su primera fila. Después de comprobar que moveToFirst devuelve verdadero, su ciclo while será un ciclo do {} while() en lugar de while loop. –

0

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. Este es un ejemplo de su aplicación,

if (cursor.getCount() == 0 || !cursor.moveToFirst()) { 

return cursor.getLong(cursor.getColumnIndexOrThrow(ID_COLUMN)); 

cursor.close(); 
Cuestiones relacionadas