sQueryite的rawQuery()抛出IllegalArgumentException

时间:2017-10-30 16:32:35

标签: android sqlite exception

我的查询是:

Cursor cursor = dbReader.rawQuery("SELECT CategoryID FROM categories WHERE CategoryTitle = ?", new String[]{categoryTitle});

此结果错误:

<expr> expected, got '?'

我把它改为:

 Cursor cursor = dbReader.rawQuery("SELECT CategoryID FROM categories WHERE CategoryTitle = '?'", new String[]{categoryTitle});

结果异常:

java.lang.IllegalArgumentException: Cannot bind argument at index 1 because the index is out of range.  The statement has 0 parameters.

但更改为:

Cursor cursor = dbReader.rawQuery("SELECT CategoryID FROM categories WHERE CategoryTitle = '"+ categoryTitle+ "'", new String[]{});

它与我合作.... 上面两个查询有什么问题?

This screenshot for first query

4 个答案:

答案 0 :(得分:3)

在第二个查询中:不应引用变量。 '?'应该?作为可以绑定值的变量。 '?'是一个文字问号,而不是变量。

第一个查询没问题。消息

<expr> expected, got '?'

不是错误,而是来自Android Studio的一个警告,它试图验证您的SQL,但对SQL语法并不是很了解。你可以忽略那个警告。关于它已经bug report

答案 1 :(得分:0)

尝试使用静态最终变量。像这样:

private final String MY_QUERY = "SELECT CategoryID FROM categories WHERE CategoryTitle = ?"
...
Cursor cursor = dbReader.rawQuery(MY_QUERY, new String[]{categoryTitle});

答案 2 :(得分:0)

"SELECT CategoryID FROM categories WHERE CategoryTitle = ?"是一个有效的查询。

Android Studio未将其验证为纯SQL,而是Room SQL

Room使用不同的占位符,查询将如下所示:

"SELECT CategoryID FROM categories WHERE CategoryTitle = :title"

你没有使用房间,所以不要改变它。

另见bug report

答案 3 :(得分:0)

在第一个查询中,您可以使用反引号`?`,这样可以正常工作。因为android studio试图理解这是否是一个值。作为?只能应用于值。以前我的查询出现了同样的错误,但是反引号后错误消失了,就像魅力一样。