2012-05-14 149 views
9

如何爲我的CursorLoader定義一個GROUP BY查詢?GROUP BY with CursorLoader

的兩個構造一個CursorLoader我看拿一個單一的ContextContextUriprojectionselectionselectionArgssortOrder

但是沒有groupBy

(我使用的是Android 2.3設備的支持包)

回答

24

不是真的...

您可以定義一個特定的URI您的具體GROUP BY子句。

舉例來說,如果你有一個表mPersonTable,可能是由性別分組,您可以定義以下的URI:

PERSON 
PERSON/# 
PERSON/GENDER 

查詢時,您的查詢之間進行切換,因此您可以通過參數添加組:

public Cursor query(Uri uri, String[] projection, String selection, 
      String[] selectionArgs, String sortOrder) { 
    String groupBy = null; 
    switch (mUriMatcher.match(uri)) { 
     case PERSON_ID: 
     ... 
     break; 
     case PERSON_GENDER: 
     groupBy = GENDER_COLUMN; 
     case PERSON: 
     SQLiteQueryBuilder builder = new SQLiteQueryBuilder(); 
     builder.setTables(mPersonTable); 
     builder.setProjectionMap(mProjectionMap); 
     return builder.query(db, projection, selection, selectionArgs, groupBy, having, sortOrder, limit); 
     default: 
     break; 
    } 
} 

其實,你可以通過任何類型的參數來查詢

實驗值:使用UriMatcher,以配合您的查詢實現的URI。

+1

這其實是一個很大的變通,儘管它已經要求內容提供商,以支持其加入集團!謝謝! – dbm

+0

是的,當然!別客氣。 – JPMagalhaes

+0

@JPMagalhaes:請幫幫我。我正在做同樣的事情,但沒有得到如何得到實現。你可以請更多的代碼來說明如何改變它。 –

2

顯然,(這是一個有點尷尬)在documentation的第一行中明確指出,CursorLoader查詢ContentResolver檢索Cursor 。雖然ContentResolver沒有公開任何方式GROUP BY,因此,CursorLoader也無法公開此類功能。

所以我自己的問題的表面答案是:你不能!

6

您可以通過選擇參數

new CursorLoader(context,URI, 
         projection, 
           selection+") GROUP BY (coloum_name", 
         null,null); 
+3

我認爲這很有用,因爲它似乎是與現有內容提供商合作的唯一答案(不能爲該組添加uri)但它有點可怕。 –