繁体   English   中英

Android:ContentResolver查询中的无效列数(*)

[英]Android: Invalid column count(*) in ContentResolver query()

我正在开发一个Android应用程序,我想阅读通话记录。 我找到了很多方法,但是我想使用更复杂的查询,例如COUNT,SUM和GROUP BY。

以下作品:

Uri allCalls = Uri.parse("content://call_log/calls");
Cursor cursor = context.getContentResolver().query(allCalls, null, null, null, null);

如果我想使用更高级的语法,如下所示

Uri allCalls = Uri.parse("content://call_log/calls");
String[] columns = new String[] { CallLog.Calls.NUMBER, CallLog.Calls.CACHED_NAME, "count(" + CallLog.Calls.NUMBER + ") as total" };
String selection = " 0 == 0) (GROUP BY (" + CallLog.Calls.NUMBER + "), (" + CallLog.Calls.CACHED_NAME + ")";
Cursor cursor = context.getContentResolver().query(allCalls, columns, selection, null, "count("+ CallLog.Calls.NUMBER +") DESC");

该应用程序崩溃并显示以下错误:

java.lang.IllegalArgumentException: Invalid column count(number) as total

我尝试了不同的变体,例如count(*)作为总数,count(*)没有“ as total”,但仍然没有。

你有什么主意我在做什么错吗?

我正在使用Android API级别19(4.4.2)开发

谢谢

之所以崩溃,是因为您在columns变量中使用count(" + CallLog.Calls.NUMBER + ") as total是非法的。 您只能将表示列名的字符串放入contentResolver.query()参数中,例如CallLog.Calls.NUMBER,仅此而已。 您可以通过运行查询来获取计数,然后从返回的游标中获取计数,但是内容提供者/解析器模型确实不支持group by子句。 我从未尝试过,但也许其他人知道解决办法。 但是您的group by子句被解释为SQL where子句的一部分。 它确实支持order by子句,因此将query调用替换为以下内容可能会有所帮助:

Cursor cursor = context.getContentResolver().query(allCalls, columns, selection, null, CallLog.Calls.NUMBER + "," + CallLog.Calls.CACHED_NAME);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM