Android SQLiteException: проблема связывания или индекса столбца вне диапазона - PullRequest
17 голосов
/ 19 апреля 2011

В 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

В чем проблема в моем коде?

Ответы [ 3 ]

40 голосов
/ 19 апреля 2011

Правильное утверждение:

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 + "%"}
);
22 голосов
/ 19 апреля 2011

Вы указали 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);

Редактировать: Как указывал @Ewoks, опция (1) неверна, поскольку подготовленные операторы могут получать параметры (? S) только в предложении WHERE.

3 голосов
/ 11 октября 2013

Если кто-то, как я, пытается (и не может) заставить это работать с 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...