Android SQLiteException: проблема привязки или индекса столбца вне диапазона
В android я использую следующую инструкцию.
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"});
Он бросает android.database.sqlite.SQLiteException: bind or column index out of range: handle 0x132330
В чем проблема в моем коде?
Ответы
Ответ 1
Правильный оператор:
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 + "%"}
);
Ответ 2
Вы предоставили 3 параметра, но в вашем запросе нет ?
. Передайте null вместо строкового массива в качестве второго аргумента в rawQuery
или замените _id
, engword
и lower(engword) as letter
в вашей строке выбора на ?
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);
Edit:
Как отметил @Ewoks, параметр (1) неверен, поскольку подготовленные операторы могут получать параметры (? S) только в предложении WHERE.
Ответ 3
Если кто-то вроде меня пытается (и не работает), чтобы заставить это работать с getContentResolver().query
здесь, как мне это удалось:
* Обновлено благодаря комментариям от @CL и @Wolfram Rittmeyer, поскольку они сказали, что это то же самое, что для rawQuery *
Правильный способ:
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);
Предыдущий ответ, открытый для 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);