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);
tableColumns : el parámetro columnas 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?
Respuestas:
tablaColumnas
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 llamada quemax
contiene el valor máximo decolumn1
dónde cláusula
WHERE
sin esa palabra clave, p. ej."column1 > 5"
?
para cosas que son dinámicas, por ejemplo,"column1=?"
-> verwhereArgs
whereArgs
?
enwhereClause
el orden en que aparecenlos demás
whereClause
la declaración después de la palabra clave onull
si no la usa.Ejemplo
es equivalente a la siguiente consulta sin procesar
Al usar la versión Where / Bind -Args, obtienes valores de escape automáticamente y no tienes que preocuparte si contienen datos de entrada
'
.Inseguro:
String whereClause = "column1='" + value + "'";
Seguro:
String whereClause = "column1=?";
porque si el valor contiene un
'
enunciado, su declaración se rompe y obtiene excepciones o hace cosas no intencionadas, por ejemplovalue = "XYZ'; DROP TABLE table1;--"
, incluso podría abandonar su tabla, ya que la declaración se convertiría en dos declaraciones y un comentario:el uso de la versión args
XYZ'; DROP TABLE table1;--
se escaparía'XYZ''; DROP TABLE table1;--'
y solo se trataría como un valor. Incluso si'
no está destinado a hacer cosas malas, es bastante común que las personas lo tengan en sus nombres o lo usen en textos, nombres de archivos, contraseñas, etc. Así que siempre use la versión args. (Está bien construirint
y otras primitivas directamente enwhereClause
aunque)fuente
limit
parámetro, por ejemplo developer.android.com/reference/android/database/sqlite/... que todo concatenación simplemente texto, al final lo que puede poner por ejemplo"some_column LIMIT 10"
enorderBy
y aún funcionaríatable1 CROSS JOIN table2
, el nombre de la tabla. Pero hay un punto donde miraría rawquery: stackoverflow.com/q/10598137/995891query
métodos simplemente agregan algunas palabras clave comoSELECT
yFROM
a los argumentos (ver fuente) y luego hacen unarawQuery
con la cadena de consulta resultante. Si su consulta no se ajusta bien a los argumentos disponibles dequery
, solo escriba la cadena de consulta usted mismo.Esta es una respuesta más general que pretende ser una referencia rápida para futuros espectadores.
Ejemplo
Explicación de la documentación.
fuente
La cláusula where y los argumentos funcionan juntos para formar la instrucción WHERE de la consulta SQL. Entonces di que buscas expresar
Entonces su whereClause y whereArgs serán los siguientes
Si desea seleccionar todas las columnas de la tabla, creo que una cadena nula pasada a tableColumns será suficiente.
fuente
?
en'
el'
se añade de forma automática, si es necesariosi tu consulta SQL es así
Luego, para el método query (), podemos hacer lo siguiente: -
fuente
TABLE_ROW_ID + "=" + rowID
Aquí=
está lawhere
cláusula. Para seleccionar todos los valores, deberá proporcionar todos los nombres de columna:y aquí hay un buen tutorial para la base de datos.
fuente