关于 Android ContentResolver Query Group By

Posted

技术标签:

【中文标题】关于 Android ContentResolver Query Group By【英文标题】:About Android ContentResolver Query Group By 【发布时间】:2012-08-12 10:57:59 【问题描述】:

我测试了 sql,它在 Sqlite Spy 中运行良好:

select ifnull(_name, _number) as identifer, count(_id) as amount from call group by identifer

我想在 ContentConsolver 中使用它,但它不能与“group by”一起使用:

String[] projections = new String[]  "ifnull(name, number) as identifer", "count(_id) as amount" ;
String group = "identifer";
//String selection = ") GROUP BY (" + group;
Cursor cursor = getContentResolver().query(CallLog.Calls.CONTENT_URI, projections, null, null, null /*!group*/ );

我该怎么办?

【问题讨论】:

如果ContentProvider 查询的ContentResolver 不公开带有group-by 的URI 或不支持group-by 参数的某些URI 参数,您将不得不进行分组阅读Cursor的全部内容后在Java代码中。 暂时解决,ICS 出错!添加: String selection = " 1 = 1 ) GROUP BY (identifer"; 【参考方案1】:

@njzk2 使用 HashSet 达到了目的:Group By in ContentResolver in Ice Cream Sandwich,但如果你想要求和,它不能与 count() 一起使用。 我认为最好的解决方案是制作 CallLog Database 的副本,然后您可以使用 rawQuery() 或任何您想要的(可能是浪费性能)。

private void refreshDbCache()

    CallDbCache dbCache = new CallDbCache(this);
    dbCache.clear(CallDbCache.TB_CALL);

    String[] columns = new String[]  CallLog.Calls._ID, CallLog.Calls.NUMBER, CallLog.Calls.CACHED_NAME ;
    Cursor cursor = getContentResolver().query(URI_CALL, columns, null, null, null);
    while (cursor != null && cursor.moveToNext()) 
        int id = cursor.getInt(cursor.getColumnIndex(CallLog.Calls._ID));
        String number = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER));
        String name = cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME));
        dbCache.insert(CallDbCache.TB_CALL, new LogData(id, number, name, "", "", "", ""));
    
    cursor.close();

    dbCache.close();

【讨论】:

以上是关于关于 Android ContentResolver Query Group By的主要内容,如果未能解决你的问题,请参考以下文章

ContactsContract.CommonDataKinds.Event.START_DATE 包括联系电话号码

关于Android Lollipop

关于Android发送邮件

关于Android的Build类——获取Android手机设备各种信息

20200628-关于Android

关于“使用 Android 播放任意音调”