2012-08-16 118 views
0

我测试SQL,它在SQLite的间谍工作正常:关于Android的ContentResolver的查询组通过

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

而且我想在ContentConsolver使用它,但它也不能“按组”一起工作:

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*/); 

我该怎么办?

+0

如果由'ContentResolver'查询的'ContentProvider'不与组由暴露的URI或支持了一些URI参数组的参数你将不得不做Java中的分组代码在读完'Cursor'的全部内容之后。 – Jens 2012-08-16 05:51:01

+0

暂时解决,ICS出错! add:String selection =“1 = 1)GROUP BY(identifer”; – thecr0w 2012-08-16 06:56:59

回答

0

@ njzk2通过使用HashSet:Group By in ContentResolver in Ice Cream Sandwich做了诀窍,但如果你想要sum,它不会与count()一起工作。 我认为最好的解决方案是制作一个CallLog数据库的副本,然后你可以使用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(); 
}