【问题标题】:rawQuery() of sqlite throw IllegalArgumentExceptionsqlite 的 rawQuery() 抛出 IllegalArgumentException
【发布时间】:2017-10-30 16:32:35
【问题描述】:

我的查询是:

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

【问题讨论】:

  • 您的查询看起来不错。从您的屏幕截图来看,它看起来像是 AS 3.0 的东西。只需运行应用程序,它应该可以正常运行。
  • 我尝试运行,但不能像截图一样工作...... AS 3.0 中是否有错误?
  • 您的查询是没有给您预期的输出还是没有编译?
  • 对不起我的朋友,我现在尝试运行它,它工作正常,但仍然出现红线错误

标签: android sqlite exception


【解决方案1】:

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

第一个查询没问题。留言

<expr> expected, got '?'

不是错误,而只是来自 Android Studio 的警告,它试图验证您的 SQL,但对 SQL 语法知之甚少。您可以忽略该警告。已经有一个 bug report 关于它。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢,你的回答很好,我试了一下,但我想知道第一个查询有什么问题,如屏幕截图所示
    • @amralsaidy 查询没有问题。正如laalto所说,问题似乎来自IDE,它无法识别SQL查询。所以,我想说不要担心。此外,硬编码不是一个好习惯,因此您要考虑在这种情况下使用静态最终变量:)
    【解决方案3】:

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

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

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

    "SELECT CategoryID FROM categories WHERE CategoryTitle = :title"

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

    另见bug report

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-18
        • 2014-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多