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/

  • SQLite demasiados términos en SELECT compuesto
  • SQLite Android asignación de la ventana de cursor de 2048 kb falló
  • SQLite: Consulta que devuelve datos antiguos / en caché
  • SQLite de Android que elimina una fila específica de la base de datos
  • Cómo convertir el objeto de cursor en XML o JSON en android
  • Recyclerview + Proveedor de contenido + CursorLoader
  • Android: ¿Dónde se almacenan los archivos de base de datos?
  • Ordenar los datos de la base de datos y mostrarlos en la vista de lista
  • Android AsyncTask - una subclase por operación de base de datos?
  • Custom SimpleCursorAdapter, consulta de base de datos y NullPointerException
  • No se copia la base de datos de la carpeta de activos al dispositivo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.