将DISTINCT与SQLiteDatabase查询方法一起使用时如何不使用LIMIT?

时间:2019-05-10 05:48:57

标签: java android android-sqlite

我想通过SQliteDatabase query 方法使用SQL SELECT DISTINCT book FROM bible ORDER BY book;,我尝试:-

Cursor csr = mDB.query(true,TABLE_BIBLE,new String[]{COL_BIBLE_BOOK},whereclause,whereargs,null,null,COL_BIBLE_BOOK,"-999");

4个查询中的两个对DISTINCT具有布尔值true,都必须具有LIMIT参数。 SQLite表示否定没有限制,但是这样做会产生类似错误

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.bible/com.example.bible.MainActivity}: java.lang.IllegalArgumentException: invalid LIMIT clauses:-999

我知道您可以使用 rawQuery 进行操作,但不建议从Android Devloper Guide中使用它。因此要使用查询

我也知道您可以使用数量很大但效果不佳的数字。

2 个答案:

答案 0 :(得分:3)

  

SQLite对否定表示否定

它在哪里这么说?我将docs读为:

  

传递null表示没有LIMIT子句。

...

  

我知道您可以使用rawQuery,但不建议从Android Devloper Guide中使用它

rawQuery()很好,即使API设计人员希望您使用更高级的方法来构造SQL。


  

SELECT说,如果LIMIT表达式的计算结果为负值,则返回的行数没有上限

是真的,并且可以在原始sqlite SQL中使用。

如果您使用query(),则会从SQLiteQueryBuilder获得额外的验证,从而引发您所看到的异常。参见source

答案 1 :(得分:2)

您可以使用 (就像其他大多数参数一样(第一个(表名)除外)):-

Cursor csr = mDB.query(true,TABLE_BIBLE,new String[]{COL_BIBLE_BOOK},whereclause,whereargs,null,null,COL_BIBLE_BOOK,null);

或者,您可以在列名称中加上DISTINCT(在这种情况下),例如:-

Cursor csr = mDB.query(TABLE_BIBLE,new String[]{"DISTINCT " + COL_BIBLE_BOOK},whereclause,whereargs,null,null,COL_BIBLE_BOOK);

第一个可能更可取。