我想通过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中使用它。因此要使用查询。
我也知道您可以使用数量很大但效果不佳的数字。
答案 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);
第一个可能更可取。