2010-06-03 15 views
7

मैं एंड्रॉइड के लिए नौसिखिया हूँ। दरअसल, मैं सामग्री प्रदाता & सामग्री समाधानकर्ता के साथ मीडिया प्रदाता से डेटा पूछना चाहता हूं।"समूह द्वारा" विकल्प के साथ मीडिया प्रदाता से कैसे पूछें?

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; 

मैं कोशिश की है इस प्रकार है projection और where की स्थापना:

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

और where:

_data LIKE "A" OR _data LIKE "B" 

लेकिन, मुझे क्वेरी विकल्प GROUP BY _id सेट करने का तरीका नहीं मिला।

कृपया मेरी मदद करें।

उत्तर

3

मुझे यकीन नहीं है कि यह संभव है या नहीं।

मैं हाल ही में इसी तरह की चीजों से जूझ रहा था, और मैं ContentProvider से डेटा को एक अस्थायी तालिका में डालने और परिणामों के लिए तालिका पूछकर काम करने में कामयाब रहा।

कहानी यह है कि ContentProvider के पीछे डेटा डेटाबेस नहीं हो सकता है। यह एक्सएमएल, जेएसओएन, फाइलसिस्टम इत्यादि हो सकता है ... इसलिए इनके पास GROUP BY विकल्प नहीं है, और इसलिए उन्होंने इसे छोड़ दिया। आप यह भी नहीं मान सकते कि count(_id) काम करेगा।

4

आप ContentProvider से नहीं कर सकते हैं। अब, यदि आप अपना ContentProvider लिख रहे हैं तो आप इसे कार्यान्वित कर सकते हैं। आपके कंटेंट प्रदाता के अंदर आपको SQLiteQueryBuilder क्लास का उपयोग करना होगा जिसमें query() विधि है जो GROUP BY स्ट्रिंग लेती है।

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

इस वर्ग भी एक setDistinct(true) विधि है कि क्वेरी के रूप में विशिष्ट सेट, के रूप में है, जिसे आपने अपने एसक्यूएल बयान में आवश्यकता होती है।

+0

सामग्री प्रदाता समूह के आधार पर यहां लागू किया गया है: https://github.com/novoda/SQLiteProvider – Blundell

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

इस आईसीएस में अब और काम नहीं करता है ... – njzk2

+0

लगता है जैसे यह एक पूरी तरह से भरोसेमंद हैक नहीं हो सकता है –

1

पहले सभी बंद बहाना मेरी गरीब अंग्रेजी! मैं, जावा/एंड्रॉयड के लिए नया हूँ 4.2.1 के साथ शुरू किया और उस के साथ लड़ाई भी लगभग 2 दिन, तो मैं कुछ और जानकारी SQLiteQueryBuilder के बारे में query हिस्सा काफी है कि क्या यू की तलाश कर रहे है पढ़ना शुरू;)

यह है:

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) 
यहाँ

यू के आसपास चाल कर सकते हैं, मैं तुम्हें पोस्ट करेंगे मेरी कोड स्निप:

@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; 
} 

अपने thats!

यहाँ

कोड मैं निष्पादित करने के लिए उपयोग करें:

 Cursor showsc = getContext().getContentResolver().query(
      WhatsOnTVProvider.CONTENT_EPISODES_NEXT_URI, 
      EpisodenTable.allColums_inclCount, 
      String.valueOf(Calendar.getInstance().getTimeInMillis()/1000) 
        + " < date", null, null); 
संबंधित मुद्दे