índice válido util statement rango psqlexception prepared org número getvalidcolumnindex fuera faltan está definiciones columnas columna android sqlite

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.