válido - Android SQLiteException: enlace o índice de columna fuera del rango de problema
prepared statement (3)
En Android estoy usando la siguiente declaración.
model = dataHelper.rawQuery("SELECT _id, engword, lower(engword) as letter FROM word WHERE letter >= ''a'' AND letter < ''{'' AND engword LIKE ''%" + filterText + "%''", new String[ {"_id","engword", "lower(engword) as letter"});
Está lanzando android.database.sqlite.SQLiteException: bind or column index out of range: handle 0x132330
¿Cuál es el problema en mi código?
La declaración correcta es:
model = dataHelper.rawQuery("
SELECT _id, engword, lower(engword) as letter
FROM word W
HERE letter >= ''a''
AND letter < ''{''
AND engword LIKE ? ORDER BY engword ASC
",
new String[] {"%" + filterText + "%"}
);
Si alguien es como yo, que intenta (y falla) que esto funcione con getContentResolver().query
aquí cómo lo getContentResolver().query
:
* Actualizado gracias a los comentarios de @CL y @Wolfram Rittmeyer, ya que dijeron que esto es lo mismo que para rawQuery *
Manera correcta:
public static String SELECTION_LIKE_EMP_NAME = Columns.EMPLOYEE_NAME
+ " like ?";
Cursor c = context.getContentResolver().query(contentUri,
PROJECTION, SELECTION_LIKE_EMP_NAME, new String[] { "%" + query + "%" }, null);
Respuesta anterior que estaba abierta al ataque de inyección SQL:
public static String SELECTION_LIKE_EMP_NAME = Columns.EMPLOYEE_NAME
+ " like ''%?%''";
String selection = SELECTION_LIKE_EMP_NAME.replace("?", query);
Cursor c = context.getContentResolver().query(contentUri,
PROJECTION, selection, null, null);
Usted proporcionó 3 parámetros pero no tiene ?
en su consulta. Pase nulo en lugar de la matriz de cadenas como segundo argumento a rawQuery
o reemplace _id
, engword
y lower(engword) as letter
en su cadena seleccionada por ?
1)
model = dataHelper.rawQuery("SELECT ?, ?, ? FROM word WHERE letter >= ''a'' AND letter < ''{'' AND engword LIKE ''%" + filterText + "%''",new String[] {"_id","engword", "lower(engword) as letter"});
2)
model = dataHelper.rawQuery("SELECT _id, engword, lower(engword) as letter FROM word WHERE letter >= ''a'' AND letter < ''{'' AND engword LIKE ''%" + filterText + "%''", null);
Edición: Como señaló @Ewoks, la opción (1) es incorrecta, ya que las declaraciones preparadas pueden obtener parámetros (? S) solo en la cláusula WHERE.