Android SQLiteException:绑定或列索引超出范围问题

dev*_*oid 17 sqlite android

在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"});
Run Code Online (Sandbox Code Playgroud)

它在扔 android.database.sqlite.SQLiteException: bind or column index out of range: handle 0x132330

我的代码有什么问题?

dev*_*oid 40

正确的陈述是:

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 + "%"}
);
Run Code Online (Sandbox Code Playgroud)


ern*_*azm 22

您提供了3个参数,但?查询中没有.传递null而不是字符串数组作为第二个参数rawQuery或替换_id,engwordlower(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"});
Run Code Online (Sandbox Code Playgroud)

2)

model = dataHelper.rawQuery("SELECT _id, engword, lower(engword) as letter FROM word WHERE letter >= 'a' AND letter < '{' AND engword LIKE '%" + filterText + "%'", null);
Run Code Online (Sandbox Code Playgroud)

编辑: 正如@Ewoks指出的那样,选项(1)是不正确的,因为预处理语句只能在WHERE子句中获取参数(?s).