我正在开发一个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(*)为total,count(*)而不是“as total”,但仍然没有。
你有什么想法我做错了吗?
我正在开发Android API级别19(4.4.2)
由于
答案 0 :(得分:1)
崩溃是因为您在count(" + CallLog.Calls.NUMBER + ") as total
变量中使用columns
是非法的。您只能将表示列名的字符串放入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);