我的查询是:
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[]{});
它与我合作.... 上面两个查询有什么问题?
答案 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试图理解这是否是一个值。作为?只能应用于值。以前我的查询出现了同样的错误,但是反引号后错误消失了,就像魅力一样。