Los métodos query() y rawQuery()

En el ejemplo anterior hemos utilizado el método rawQuery() para hacer una consulta. Este método tiene una versión alternativa con la misma función el método query(). El método query() es el usado por defecto en la documentación oficial y además es el único disponible en otras clases (por ejemplo para hacer una consulta en un ContentProvider). Sin embargo, tiene un inconveniente respecto al método rawQuery(), has de rellenar gran cantidad de parámetros para controlar la búsqueda, lo que lo hace confuso de utilizar. Si estás acostumbrado a trabajar con SQL es posible que este método te resulte incómodo. A continuación se describen los parámetros de ambos métodos:

Cursor SQLiteDatabase.query (
      Stringtable,         
//tabla a consultar (FROM)
      String[] columns,      //columnas a devolver (SELECT)
      Stringselection,      //consulta (WHERE)
      String[] selectionArgs,//reemplaza “?” de la consulta
      StringgroupBy,        //agrupado por (GROUPBY)
      Stringhaving,         //condición para agrupación
      StringorderBy,        //ordenado por
      Stringlimit)          //cantidad máx. de registros

Cursor SQLiteDatabase.rawQuery(
      Stringsql,            
//comando SQL
      String[] selectionArgs)//reemplaza “?”de la consulta

Veamos un ejemplo de cómo se podrían utilizar estos métodos. Supongamos que hemos creado la tabla, tabla, y que tiene las columnas texto, entero y numero. Si quisiéramos seleccionar las columnas texto y entero de las filas con el valor de numero mayor que 2, ordenados según el valor de entero y que además el número de filas seleccionadas estuviera limitado a un máximo de cantidad. (donde cantidad ha de ser una variable de tipo entero previamente definida), escribiríamos:

Cursor cursor = db.rawQuery("SELECT texto, entero FROM tabla"+
   " WHERE numero>2 ORDER BY entero LIMIT "+ cantidad,null);

Cuando uno está acostumbrado al lenguaje SQL esta puede ser la forma más sencilla de hacer la consulta. De forma alternativa podemos hacer uso del segundo parámetro. Este ha de ser un array de String, de forma que estos Strings reemplazan cada una de las apariciones del carácter “?” en la cadena del primer parámetro. Veamos un ejemplo que sería equivalente al anterior:

String[] param = new String[1];

   param[0]= Integer.toString(cantidad,10);

   Cursor cursor = db.rawQuery("SELECT texto, entero FROM tabla" +
                 " WHERE numero>2 ORDER BY entero LIMIT ?", param);

Si en lugar de método rawQuery() queremos utilizar el método query() usaríamos el siguiente código equivalente a los dos anteriores:

String[] CAMPOS = {"texto", "entero"};

Cursor cursor = db.query("tabla", CAMPOS, "numero>2, null,
          null, null, "entero", Integer.toString(cantidad));

Ejercicio paso a paso: Utilización del método query() para guardar puntuaciones

1.      Remplaza la llamada al método rawQuery()  del ejercicio anterior por el siguiente código:

String[] CAMPOS = {"puntos", "nombre"};
Cursor cursor=db.query("puntuaciones", CAMPOS, null, null,
       null, null, "puntos DESC", Integer.toString(cantidad));

2.     Verifica que el funcionamiento es idéntico.

Preguntas de repaso:  SQLite I