2010-06-03 7 views
7

我是Android的新手。 實際上,我想從內容提供商&內容解析器查詢媒體提供商的數據。如何使用「group by」選項從MEDIA提供程序進行查詢?

c = mContent.query(CONTENT_URI,projection,where,null,null); 

我的問題是,我怎麼可以查詢從媒體提供的數據如下使用GROUP BY條款:

select DISTINCT _id, count(_id), _data FROM aaa_table WHERE _data LIKE "A" OR _data LIKE "B" GROUP BY _id; 

我已經嘗試設置projectionwhere如下:

final String[] projection = new String[] { 
       "_id", 
       "COUNT ("+ _id +")" , 
       "_data" 
       }; 

where

_data LIKE "A" OR _data LIKE "B" 

但是,我找不到如何設置查詢選項GROUP BY _id

請幫幫我。

回答

3

我不確定這是否可能。

最近我一直在與類似的東西苦苦掙扎,我設法通過將ContentProvider中的數據插入臨時表並查詢結果表來解決問題。

故事是ContentProvider背後的數據可能不是數據庫。它可以是XML,JSON,FileSystem等等...所以這些沒有GROUP BY選項,因此他們將它遺漏了。你也不能總假設count(_id)會起作用。

4

你不能從ContentProvider。現在,如果您正在編寫ContentProvider,則可以實施它。在您的內容提供商內部,您必須使用SQLiteQueryBuilder類,該類具有采用GROUP BY字符串的query()方法。

http://developer.android.com/reference/android/database/sqlite/SQLiteQueryBuilder.html

這個類也有一個setDistinct(true)方法設置查詢的鮮明,那樣你表明你在你的SQL語句需要。

+0

內容提供商集團通過在這裏實現:https://github.com/novoda/SQLiteProvider – Blundell 2012-11-27 10:38:30

9
where = "_data LIKE 'A' OR _data LIKE 'B'"; 
where += ") GROUP BY (_id"; // note the char ')' and '(', the ContentResover will completed for U 
c = mContent.query(CONTENT_URI,projection,where,null,null); 

全球化志願服務青年頁= http://zengyan2012.iteye.com/blog/1118963

+1

這並不在ICS工作了... – njzk2 2011-12-28 09:30:01

+0

似乎像這可能不是一個完全可靠的黑客 – 2012-03-22 23:27:16

1

第一關都原諒我的英語不好! 我是新來的Java/Android的,開始與4.2.1,並與戰鬥太近2天,然後我開始閱讀一些更詳細瞭解SQLiteQueryBuilderquery部分非常多,什麼ü正在尋找;)

它具有:

public Cursor query (SQLiteDatabase db, String[] projectionIn, String selection, String[] selectionArgs, String groupBy, String having, String sortOrder) 

內容提供商的查詢「功能」只給你:

query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) 

這裏u能欺騙的時候,我會後你我的代碼剪斷:

@Override 
public Cursor query(Uri uri, String[] projection, String selection, 
     String[] selectionArgs, String sortOrder) { 
    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); 
    final SQLiteDatabase db = mOpenHelper.getReadableDatabase(); 
/* a String is a Object, so it can be null!*/ 
    String groupBy = null; 
    String having = null; 

    switch (sUriMatcher.match(uri)) { 
... 
... 
... 
     case EPISODES_NEXT: 
     groupBy = "ShowID"; 
     queryBuilder.setTables(EpisodenTable.TableName); 
     break; 
    default: 
     throw new IllegalArgumentException("Unknown URI " + uri); 
    } 

    Cursor c = queryBuilder.query(db, projection, selection, selectionArgs, 
      groupBy, having, sortOrder); 
    c.setNotificationUri(getContext().getContentResolver(), uri); 
    return c; 
} 

這就是它的!

在這裏,我用它來執行代碼:

 Cursor showsc = getContext().getContentResolver().query(
      WhatsOnTVProvider.CONTENT_EPISODES_NEXT_URI, 
      EpisodenTable.allColums_inclCount, 
      String.valueOf(Calendar.getInstance().getTimeInMillis()/1000) 
        + " < date", null, null);