2012-05-15 10 views
106

Estoy utilizando el método de consulta de SQLiteDatabase. ¿Cómo uso el método de consulta?Método SQLiteDatabase.query

yo probamos este:

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

tableColumns - parámetro columnas se construye como sigue.

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?

+1

intentar un enfoque simple como [esto] (http://pastebin.com/3pfzXMgv) –

+0

Conozco ese método. Pero estoy tratando de aprender cómo implementar el método de consulta en lugar de rawQuery. –

Respuesta

215

tableColumns

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

whereClause

  • la parte que se pone después WHERE sin esa palabra clave , p.ej "column1 > 5"
  • debe incluir ? para elementos dinámicos, p. Ej."column1=?" -> ver whereArgs

whereArgs

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

los demás

  • al igual que whereClause la declaración después de la palabra clave o null si no lo 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 prima

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 el Donde/BIND versión -Args se obtiene automáticamente los valores escaparon y Don no tiene que preocuparse si los datos de entrada contienen '.

inseguro: String whereClause = "column1='" + value + "'";
seguro: String whereClause = "column1=?";

porque si el valor contiene un ' su estado de cuenta o bien se rompe y se obtiene excepciones o no no planeados cosas, por ejemplo value = "XYZ'; DROP TABLE table1;--" incluso podría dejar su mesa desde la declaración se convertiría en dos estados y un comentario:

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

usando los argumentos versión XYZ'; DROP TABLE table1;-- se escapó a '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 lo tenga en sus nombres o lo use en textos, nombres de archivos, contraseñas, etc. Así que siempre use la versión args. (Está bien construir int y otras primitivas directamente en whereClause)

+0

¿Dónde cae el límite/desplazamiento en este ... grupo by? ¿teniendo? orderby? – Lion789

+2

@ Lion789 hay varias versiones que tienen un parámetro 'limit', p. http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#query%28java.lang.String,%20java.lang.String[],%20java.lang.String,%20java.lang .String [],% 20java.lang.String,% 20java.lang.String,% 20java.lang.String,% 20java.lang.String% 29 todo es simplemente una concatenación de texto simple al final para que pueda poner, por ejemplo '" some_column LIMIT 10 "' en 'orderBy' y aún funcionaría – zapl

+0

¿Alguna opción aquí para unir 2 tablas? –

13

Donde cláusula y argumentos trabajan juntos para formar la instrucción WHERE de la consulta SQL. Así que digamos que busca expresar

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

Luego, 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 una cadena nula pasado a tableColumns será suficiente.

+0

no encierre '?' En ''', el '' 'se agrega automáticamente si es necesario – zapl

0
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í es un buen tutorial para la base de datos de

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

12

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 documentation

  • table de la secuencia: El nombre de la tabla para compilar la consulta en contra.
  • columns Cadena: Una lista de las columnas a devolver. Pasar nulo devolverá todas las columnas, lo cual se desaconseja para evitar que se almacene el dato que no se va a utilizar.
  • selection Cadena: Un filtro que declara las filas a devolver, formateado como una cláusula SQL WHERE (excluyendo WHERE). Pasando null devolverá todas las filas para la tabla dada.
  • selectionArgs Cadena: Puede incluir? S en la selección, que será reemplazada por los valores de selectionArgs, para que aparezcan en la selección. Los valores estarán ligados como cadenas.
  • groupBy Cadena: Un filtro que declara cómo agrupar filas, formateado como una cláusula SQL GROUP BY (excluyendo el GROUP BY). Pasar nulo hará que las filas no se agrupen.
  • having Cadena: Un filtro declara qué grupos de filas incluir en el cursor, si se está utilizando la agrupación de filas, formateado como una cláusula SQL HAVING (excluyendo el HAVING mismo). Pasar nulo hará que se incluyan todos los grupos de la fila , y se requiere cuando no se esté utilizando la agrupación de filas .
  • orderBy Cadena: cómo ordenar las filas, formateadas como una cláusula ORDER BY de SQL (excluyendo el ORDER BY). Pasar nulo utilizará el orden de clasificación predeterminado , que puede estar desordenado.
  • limit Cadena: Limita el número de filas devueltas por la consulta, formateada como cláusula LIMIT. Pasar nulo no indica ninguna cláusula LIMIT.
0

si la 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; 
método

Luego de consulta(), que podemos hacer como: -

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); 
Cuestiones relacionadas