Método SQLiteDatabase.query

Estoy utilizando el método de consulta de SQLiteDatabase. ¿Cómo utilizo el método de consulta?

He intentado 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 debe 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 ... – también puede poner expresiones complejas aquí:
    new String[] { "(SELECT max(column1) FROM table1) AS max" } le daría una columna llamada max contiene el valor máximo de column1

dónde cláusula

  • La parte que pones 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

Donde está

  • Especificar el contenido que llena cada uno ? En donde se whereClause en el orden en que aparecen

los demás

  • Al igual que whereClause la sentencia después de la palabra clave o null si no la usas.

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 en bruto

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

Mediante el uso de la versión Where / Bind -Args se obtienen automáticamente valores de escape y no tiene que preocuparse si los datos de entrada contienen ' .

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

Porque si el valor contiene una ' su instrucción se rompe y se obtienen excepciones o hace cosas imprevistas, por ejemplo value = "XYZ'; DROP TABLE table1;--" incluso podría caer su tabla ya que la declaración se convertiría en dos declaraciones y un comentario:

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

Utilizando 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 sólo sería tratado como un valor. Incluso si el ' no está destinado a hacer cosas malas todavía es bastante común que la gente la tenga en sus nombres o la utilice en textos, nombres de archivo, contraseñas, etc. Así que siempre use la versión args. (Está bien construir int y otros primitivos directamente en whereClause sin embargo)

Donde cláusula y args trabajan juntos para formar la instrucción WHERE de la consulta SQL. Así que dime que buscas expresar

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

Entonces su whereClause y whereArgs será como sigue

 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 destinada a 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 compilar la consulta.
  • columns String: una lista de las columnas a devolver. Pasar null devolverá todas las columnas, lo que se desaconseja para evitar la lectura de datos del almacenamiento que no va a utilizarse.
  • String: Filtro que declara qué filas devolver, formateado como una cláusula SQL WHERE (excluyendo WHERE). Pasar null devolverá todas las filas de la tabla dada.
  • selectionArgs String: Usted puede incluir? S en la selección, que será reemplazado por los valores de selectionArgs, para que aparezcan en la selección. Los valores se enlazarán como cadenas.
  • groupBy String: Filtro que declara cómo agrupar filas, formateado como una cláusula de SQL GROUP BY (excluyendo GROUP BY). Si se pasa null, las filas no se agruparán.
  • having String: Un filtro declara qué grupos de filas incluir en el cursor, si se está usando el agrupamiento de filas, formateado como una cláusula de SQL HAVING (excluyendo HAVING). Pasar null hará que todos los grupos de filas sean incluidos, y es necesario cuando no se está usando el agrupamiento de filas.
  • orderBy String: Cómo ordenar las filas, formateadas como una cláusula SQL ORDER BY (excluyendo ORDER BY). Pasando null utilizará el orden por defecto, que puede ser desordenado.
  • limit String: Limita el número de filas devueltas por la consulta, formateada como cláusula LIMIT. Pasar null 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/

  • ¿Qué desencadena SqliteDbOpenHelper onUpgrade ()?
  • Obtener información de la base de datos sqlite
  • Android: ORDER BY en la consulta
  • Cómo utilizar rawQuery para insertar un registro
  • Sincronizar / actualizar bases de datos sqlite
  • ¿Cómo implementar deshacer un solo paso para los cambios en la base de datos SQLite?
  • OnUpgrade () base de datos sqlite en Android
  • Cómo actualizar la base de datos Sqlite para una sola columna utilizando cláusula WHERE en android
  • SQLite insert No hay error de columna en android
  • Cómo seleccionar el valor en mayúsculas en SQLite?
  • Error en sqlite "DROP TABLE IF EXISTS" android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.