Método SQLiteDatabase.query

Estoy usando el método de consulta de SQLiteDatabase. ¿Cómo uso el método de consulta?

Intenté esto:

Cursor cursor = sqLiteDatabase.query( tableName, tableColumns, whereClause, whereArgs, groupBy, having, orderBy); 

El parámetro tableColumns – columns se construye de la siguiente manera.

 String[] columns = new String[]{KEY_ID, KEY_CONTENT}; 

Si necesitamos obtener todos los campos, ¿cómo debería construirse el parámetro de columna? ¿Necesitamos incluir todos los nombres de campo en la matriz de cadenas?

¿Cómo uso correctamente el método de consulta?

tableColumns

  • null para todas las columnas como en SELECT * FROM ...
  • new String[] { "column1", "column2", ... } para columnas específicas como en SELECT column1, column2 FROM ... – aquí también puede poner expresiones complejas:
    new String[] { "(SELECT max(column1) FROM table1) AS max" } le daría una columna llamada max sosteniendo el valor máximo de column1

dónde cláusula

  • la parte que coloca después de WHERE sin esa palabra clave, por ejemplo, "column1 > 5"
  • debe incluir ? para cosas que son dinámicas, por ejemplo, "column1=?" -> ver whereArgs

whereArgs

  • especificar el contenido que llena cada ? en whereClause en el orden en que aparecen

los demás

  • al igual que whereClause la statement después de la palabra clave o null si no la usa.

Ejemplo

 String[] tableColumns = new String[] { "column1", "(SELECT max(column1) FROM table2) AS max" }; String whereClause = "column1 = ? OR column1 = ?"; String[] whereArgs = new String[] { "value1", "value2" }; String orderBy = "column1"; Cursor c = sqLiteDatabase.query("table1", tableColumns, whereClause, whereArgs, null, null, orderBy); // since we have a named column we can do int idx = c.getColumnIndex("max"); 

es equivalente a la siguiente consulta sin procesar

 String queryString = "SELECT column1, (SELECT max(column1) FROM table1) AS max FROM table1 " + "WHERE column1 = ? OR column1 = ? ORDER BY column1"; sqLiteDatabase.rawQuery(queryString, whereArgs); 

Al utilizar la versión Where / Bind -Args obtendrá automáticamente los valores de escape y no tendrá que preocuparse si los datos de entrada contienen ' .

Inseguro: String whereClause = "column1='" + value + "'";
Seguro: String whereClause = "column1=?";

porque si el valor contiene a ' su sentencia se rompe y usted obtiene excepciones o hace cosas no intencionadas, por ejemplo value = "XYZ'; DROP TABLE table1;--" incluso puede soltar su tabla ya que la statement se convertiría en dos declaraciones y un comentario:

 SELECT * FROM table1 where column1='XYZ'; DROP TABLE table1;--' 

usando la versión args XYZ'; DROP TABLE table1;-- XYZ'; DROP TABLE table1;-- se escaparía a 'XYZ''; DROP TABLE table1;--' 'XYZ''; DROP TABLE table1;--' y solo se trataría como un valor. Incluso si el ' no está destinado a hacer cosas malas, todavía es bastante común que la gente lo tenga en sus nombres o lo use en textos, nombres de archivos, contraseñas, etc. Por lo tanto, siempre use la versión args. (Está bien construir int y otras primitivas directamente en whereClause )

Donde cláusula y argumentos trabajan juntos para formar la instrucción WHERE de la consulta SQL. Así que dile que buscas express

 WHERE Column1 = 'value1' AND Column2 = 'value2' 

Entonces su whereClause y whereArgs serán los siguientes

 String whereClause = "Column1 =? AND Column2 =?"; String[] whereArgs = new String[]{"value1", "value2"}; 

Si desea seleccionar todas las columnas de la tabla, creo que una cadena nula pasada a tableColumns será suficiente.

Esta es una respuesta más general que pretende ser una referencia rápida para los futuros espectadores.

Ejemplo

 SQLiteDatabase db = helper.getReadableDatabase(); String table = "table2"; String[] columns = {"column1", "column3"}; String selection = "column3 =?"; String[] selectionArgs = {"apple"}; String groupBy = null; String having = null; String orderBy = "column3 DESC"; String limit = "10"; Cursor cursor = db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit); 

Explicación de la documentación

  • table String: el nombre de la tabla para comstackr la consulta.
  • Cadena de columns : una lista de las columnas a devolver. Al pasar null, se devolverán todas las columnas, lo cual se desaconseja para evitar la lectura de datos del almacenamiento que no se van a usar.
  • Cadena de selection : un filtro que declara las filas a devolver, formateado como una cláusula WHERE de SQL (excluyendo el WHERE). Pasar nulo devolverá todas las filas para la tabla dada.
  • selectionArgs String: puede incluir? s en la selección, que se reemplazará por los valores de selectionArgs, para que aparezcan en la selección. Los valores estarán ligados como cadenas.
  • groupBy String: un filtro que declara cómo agrupar filas, formateado como una cláusula SQL GROUP BY (excluyendo el GROUP BY). Al pasar nulo, las filas no se agruparán.
  • having String: un filtro declara qué grupos de filas incluir en el cursor, si se está utilizando el agrupamiento de filas, formateado como una cláusula SQL HAVING (excluyendo el HAVING mismo). Al pasar nulo, se incluirán todos los grupos de filas y se requiere cuando no se utiliza la agrupación de filas.
  • orderBy String: cómo ordenar las filas, formateadas como una cláusula ORDER BY de SQL (excluyendo el ORDER BY mismo). Pasar nulo utilizará el orden de clasificación predeterminado, que puede estar desordenado.
  • Cadena de limit : limita el número de filas devueltas por la consulta, formateada como cláusula LIMIT. Pasar nulo no indica ninguna cláusula LIMIT.
  db.query ( TABLE_NAME, new String[] { TABLE_ROW_ID, TABLE_ROW_ONE, TABLE_ROW_TWO }, TABLE_ROW_ID + "=" + rowID, null, null, null, null, null ); TABLE_ROW_ID + "=" + rowID, here "=" is the where clause to select all values you will have to give all column names or you can use a raw query like this db.rawQuery("SELECT * FROM permissions_table WHERE name = 'Comics' ", null); 

y aquí hay un buen tutorial para la base de datos

http://www.anotherandroidblog.com/2010/08/04/android-database-tutorial/

si su consulta SQL es así

 SELECT col-1, col-2 FROM tableName WHERE col-1=apple,col-2=mango GROUPBY col-3 HAVING Count(col-4) > 5 ORDERBY col-2 DESC LIMIT 15; 

Luego, para el método query (), podemos hacer lo siguiente:

 String table = "tableName"; String[] columns = {"col-1", "col-2"}; String selection = "col-1 =? AND col-2=?"; String[] selectionArgs = {"apple","mango"}; String groupBy =col-3; String having =" COUNT(col-4) > 5"; String orderBy = "col-2 DESC"; String limit = "15"; query(tableName, columns, selection, selectionArgs, groupBy, having, orderBy, limit);