Método SQLiteDatabase.query
Estoy utilizando el método de consulta de SQLiteDatabase. ¿Cómo utilizo el método de consulta?
He intentado esto:
- Identificador único para SMS y contactos (para comprobar la duplicación) en Android
- Android: filtrar un SimpleCursorAdapter ListView
- ¿Cómo puedo simular una actualización de la aplicación?
- Android: java.lang.IllegalStateException: base de datos xxx.db (conn # 0) ya cerrado
- ¿Es el contexto de la aplicación siempre el mismo sin importar la clase?
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?
- Consulta SQLite de Android con clave externa utilizando la tormenta o una alternativa
- Esquema de la base de datos de Android Sqlite
- Selección de valores NULL en Android SQLite
- Cómo convertir de java.util.HashMap a android.content.ContentValues?
- No se puede realizar la operación porque no hay ninguna transacción actual al insertar en la base de datos
- ¿Cómo migrar la aplicación SQLite existente a la biblioteca de persistencia de habitaciones?
- ¿Cómo lograr límite de palabras en Sqlite Android?
- Excepción de la base de datos SQLite de Android - código 14 (no se puede abrir el archivo de base de datos)
TableColumns
-
null
para todas las columnas como enSELECT * FROM ...
-
new String[] { "column1", "column2", ... }
para columnas específicas como enSELECT column1, column2 FROM ...
– también puede poner expresiones complejas aquí:
new String[] { "(SELECT max(column1) FROM table1) AS max" }
le daría una columna llamadamax
contiene el valor máximo decolumn1
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=?"
-> verwhereArgs
Donde está
- Especificar el contenido que llena cada uno
?
En donde sewhereClause
en el orden en que aparecen
los demás
- Al igual que
whereClause
la sentencia después de la palabra clave onull
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/