2013-04-08 6 views
8

पर सूचनाएं अक्षम करें मैं किसी दिए गए ContentProvider के Uri पर अधिसूचनाओं को निलंबित करने का एक तरीका ढूंढ रहा हूं। उपयोग मामला है:किसी सामग्री प्रदाता URI

  1. एक Activity एक CursorLoader के माध्यम से एक CursorAdapter के लिए बाध्य है।
  2. ServiceContentProvider पर बहुत सारे बैच, सिंगल-पंक्ति अपडेट कर सकता है।
  3. CursorLoaderContentProviderContentResolver#notifyChange द्वारा श्रोताओं को सूचित करता है, प्रत्येक पंक्ति अद्यतन पर अपनी सामग्री को फिर से लोड करेगा।

जब से मैं ContentProvider संपादित नहीं कर सकते, और मैं बैच प्रश्नों निष्पादन पर कोई नियंत्रण नहीं है, वहाँ ContentProvider प्रबंधित सभी जिज्ञासाओं के जब तक एक Uri पर सूचनाएं निलंबित करने के लिए (क्रियान्वित Service में) एक तरह से किया गया है है मार डाला? मुझे CursorLoader की निरंतर आवश्यकता के कारण झटके से बचने के लिए इसकी आवश्यकता है।

+1

तरह दिखता है यह अधिकार प्राप्त करने के लिए: आप सेवा है और न ही सीपी से अधिक न प्रभाव है? यदि दूसरी ओर सेवा आपके नियंत्रण में है, तो कृपया आप किस प्रकार के सीपी अपडेट कर रहे हैं, इसके बारे में थोड़ा और विवरण दें। –

+0

मैं एक सरल 'फॉर' लूप के अंदर "अद्यतन या INSERT" प्रकार की क्वेरी की एक श्रृंखला निष्पादित कर रहा हूं। मैं एक 'ContentProvider' का उपयोग कर रहा हूं जो प्रत्येक' सम्मिलित करें 'या' अपडेट' के बाद अधिसूचित करता है लेकिन, इस विशेष स्थिति में, मैं सभी सूचनाओं को तब तक निलंबित करने में सक्षम होना चाहता हूं जब तक कि मैं सभी संस्थाओं को अद्यतन नहीं कर लेता। – frapontillo

+0

और भी विस्तृत होने के लिए, मैं निकोलस क्लेन (https: // github द्वारा जनरेटर के साथ अपना 'ContentProvider' उत्पन्न कर रहा हूं।कॉम/फॉक्सकीप/कंटेंटप्रोवाइडर कोड जेनरेटर) कि, 'अपडेट (उरी यूरी, कंटेंट वैल्यू वैल्यू, स्ट्रिंग सिलेक्शन, स्ट्रिंग [] चयन एआरजीएस) के अंत में,' एक सरल 'getContext() मिलता है। getContentResolver()। notifyChange (uri, null); '। – frapontillo

उत्तर

3

आप इस सेवा को अपनी सेवा में अक्षम नहीं कर सकते हैं। लेकिन आपको ContentProviderOperations का उपयोग करके उन्हें बैच करने का प्रयास करना चाहिए।

मैंने introductory post about ContentProviderOperations और क्रमशः withYieldAllowed() और withBackReference() विधियों को कवर करने वाली दो अतिरिक्त पोस्ट लिखी हैं।

खासकर बाद वाला व्यक्ति जो आपने यहां वर्णित किया है उसके लिए ब्याज का होना चाहिए।

सामग्री प्रदाता के साथ आप कई अपडेट और आवेषण बैच कर सकते हैं। यदि आप अपने ContentResolver ऑब्जेक्ट पर applyBatch() पर कॉल करते हैं तो ContentProvider उन्हें एक साथ निष्पादित करता है।

अब मैं निकोलस क्लेन का जनरेटर इस्तेमाल कभी नहीं किया है, लेकिन जब से वह एक बहुत, बहुत कुशल Android डेवलपर है और गूगल पर काम करता है, मुझे यकीन है कि उत्पन्न कोड पूरा करने के लिए केवल एक बार लेन-देन और कॉल notifyChange() का उपयोग करता है अंत में बैच।

बिल्कुल वही जो आपको चाहिए।

+0

कोड का टुकड़ा जिसके बारे में हम बात कर रहे हैं वह है [यह एक] (https://github.com/foxykeep/ContentProviderCodeGenerator/blob/master/generator/res/provider.txt#L184), और मुझे लगता है कि निकोलस नहीं था वहां कोई अधिसूचना डालें क्योंकि कोई तालिका-स्तर 'उरी' अधिसूचित नहीं किया जा सकता है, क्योंकि किसी भी 'ऑपरेशन' किसी भी 'उरी' पर काम कर सकता है। क्या मैं सही हूँ? – frapontillo

+1

आप एक सामान्य यूआरआई का उपयोग कर सकते हैं। यही संपर्क संपर्क और कैलेंडर नियंत्रण कर रहे हैं। वे [कैलेंडरContract.CONTENT_URI] (http://developer.android.com/reference/android/provider/CalendarContract.html#CONTENT_URI) या [संपर्कContract.AUTHORITY_URI] (http: // डेवलपर) का उपयोग करके लागू बैच के अंत में आपको सूचित करते हैं। क्रमशः android.com/reference/android/provider/ContactsContract.html#AUTHORITY_URI)। मैं जेनरेट कोड में ऐसा कुछ जोड़ने का सुझाव देता हूं। –

+0

मैं 'ContentProvider' के बाहर परिवर्तनों को आसानी से सूचित कर सकता हूं यदि मैं 'INSERT या UPDATE' अनुकरण करने वाले संचालन के बैच को लागू करने में सक्षम हूं। क्या आपको लगता है कि 'ContentProviderOperation' को विस्तारित करना और कस्टम' InsertOrUpdate' ऑपरेशन बनाना संभव है? यह उत्पन्न कोड के साथ गड़बड़ किए बिना इसे हल करेगा। – frapontillo

0

क्या आप अपना खुद का ContentResolver बदल सकते हैं?

आप अपनी खुद की कक्षा के साथ ContentResolver को विस्तारित करने का प्रयास कर सकते हैं और आप विधि को सूचित कर सकते हैं अधिसूचना बदलें और अपने तर्क को समझें।

+0

बात यह है कि मेरे पास 'NotifyChange' में निष्पादित ऑपरेशन के बारे में कोई जानकारी नहीं है, क्योंकि यह एक नियमित व्यक्ति हो सकता है जिसे अधिसूचित करने की आवश्यकता होगी या" बैच "जो नहीं होगा। – frapontillo

0

अपनी सामग्री प्रदाता कक्षा में, query() विधि के अंदर कर्सर लौटने से पहले, बस टिप्पणी कोड जो इस

cursor.setNotificationUri(getContext().getContentResolver(), uri); 
+0

हां, लेकिन मैं जेनरेट कोड/जनरेटर को संशोधित किए बिना एक ही परिणाम प्राप्त करने का एक तरीका ढूंढ रहा हूं। – frapontillo

संबंधित मुद्दे