2011-07-05 10 views
14

में नेटवर्क से समन्वयित करते समय नेटवर्क सिंक पाश को रोकें, मैं अपना स्वयं का ContentProvider लिख रहा हूं जिसे सिंकएडाप्टर का उपयोग करके वेब सेवा में समन्वयित किया जाएगा।Android ContentProvider

समस्या तब होती है जब सिंक एडाप्टर सामग्री प्रदाता के डेटा को संशोधित कर रहा है, प्रदाता आंतरिक रूप से कॉल करने पर नेटवर्क सिंक को ट्रिगर करता है। CONTentResolver()। सूचित करें सिंक लूप का कारण बदलें।

नोटिफ़िकेशन नेटवर्क सिंक ध्वज के साथ बदलें जब क्लाइंट अनुप्रयोग संशोधन करता है लेकिन सिंक एडाप्टर संशोधित होने पर टालना चाहिए।

कंटेंटप्रोवाइडर के अंदर कोई कैसे आसानी से बता सकता है कि इसका उपयोग क्लाइंट एप्लिकेशन (जिसे संशोधन पर नेटवर्क सिंक ट्रिगर करना चाहिए) या सिंक एडाप्टर (जिसे नेटवर्क सिंक ट्रिगर नहीं करना चाहिए) द्वारा किया जा सकता है।

वर्तमान में मैं दो प्रकार के एक्सेस के बीच अंतर करने में सक्षम होने के लिए अलग-अलग CONTENT_URI का उपयोग कर रहा हूं (सिंक एडाप्टर CONTENT_URI_NO_SYNC और CONTENT_URI का उपयोग कर क्लाइंट ऐप्स का उपयोग कर डेटा एक्सेस करता है) और नेटवर्क सिंक ध्वज तदनुसार सेट करता है।

उत्तर

34

this videoSyncAdapter एस में आरईएसटी एपीआई उपयोग के बारे में देखें।

वे जिस विधि पर चर्चा करते हैं वह डेटाबेस में मेटाडेटा झंडे कॉलम का एक सेट जोड़ना है। यह हमें 3 चीजें करने की अनुमति देता है।

  1. झंडे खुद को SyncAdapter पंक्तियों में परिवर्तन और क्या उन परिवर्तन कर रहे हैं की जरूरत है निर्धारित करने के लिए अनुमति देते हैं। आप स्थानीय रूप से बनाई गई पंक्ति और स्थानीय रूप से संशोधित पंक्ति के बीच अंतर कैसे बताते हैं? इसके अलावा आप कैसे जानते हैं कि आरईएसटी एपीआई कॉल करने के लिए? यदि आप एक पंक्ति हटाते हैं, तो आपके SyncAdapter को डेटा को अभी हटाया गया है, तो डेटा को हटाया जाएगा? इसके बजाय, "हटाया जाना चाहिए" ध्वज सेट करें, और फिर, जब SyncAdapter चलाता है, तो यह सर्वर को हटाए जाने के बारे में जानता है।

  2. झंडे अपने CursorAdapter

  3. अंत में, (एक Spinner जोड़ने पता चलता है कि "यह पंक्ति सिंक हो रहा है" की तरह) का मानना ​​है कि बनाई गई है संशोधित करने की अनुमति है और इस वे बिंदु नहीं बाहर कर , झंडे आपको यह बताने की अनुमति देते हैं कि पंक्ति क्यों संशोधित की जा रही है। यदि किसी भी झंडे को सेट नहीं किया गया है और पंक्ति बदलती है, तो सर्वर से अद्यतन की वजह से होना चाहिए। इसलिए, नेटवर्क को सिंक करने की कोई आवश्यकता नहीं है।

तो, दो workflows इस प्रकार हैं:

स्थानीय परिवर्तन

  1. ऐप्लिकेशन को नए पंक्ति बनाता है। पंक्ति "बनाओ" ध्वज सच है।
  2. ContentProvider भंडार पंक्ति, झंडा बनाने देखता है और इसलिए यह सच नेटवर्क के = (अंतिम पैरामीटर) notifyChange(...,true);
  3. सिंक कॉल आग SyncAdapter कारण बनता है।
  4. SyncAdapter डेटाबेस स्कैन करता है, ध्वज सेट बनाने के साथ पंक्ति को पाता है और उचित सर्वर क्रिया करता है। सफलता के बाद, SyncAdapter ध्वज साफ़ करता है।(ContentProvivder पर पंक्ति अद्यतन)
  5. ContentProvider फ्लैग साफ़ करता है, कोई झंडे सेट नहीं होते हैं, इसलिए यह सूचित करता है चेंज (..., झूठा);
  6. ContentObserver रों ध्वज परिवर्तन देखते हैं, अद्यतन की तरह "सिंक समाप्त हो गया"

इन सभी चरणों का अद्यतन के लिए बराबर हैं देखने के लिए/हटाने - syncable प्रति पंक्ति एक ध्वज/अद्यतन बनाने/हटाने से प्रत्येक के लिए। अन्य जीत भी देखें - क्या होगा यदि "बनाएं" अस्थायी रूप से विफल हो जाए? सर्वर नीचे ... आप पुनः प्रयास करने के लिए कैसे जानते हैं? - सरल, आप "बनाएं" ध्वज को साफ़ नहीं करते हैं और आप इसे 15 मिनट बाद देखते हैं।

रिमोट बदलें

  1. SyncAdapter समय-समय पर सिंक की वजह से सक्रिय होता है।
  2. SyncAdapter सर्वर से एक अद्यतन प्राप्त करता है। डेटाबेस में परिवर्तन धक्का देता है। कोई झंडे सेट नहीं करता है। ContentProvider झंडे की कमी को देखता है, जानता है कि परिवर्तन सर्वर से आया होगा (या डेटाबेस परिवर्तन नहीं है जिसे सर्वर पर धक्का दिया जाना चाहिए), इसलिए यह notifyChange(...,false);
  3. ContentObserver सामग्री परिवर्तन को देखता है और इसलिए वे नई पंक्ति डेटा
+0

शानदार उत्तर के साथ अपडेट करें! अब सब कुछ क्रिस्टल स्पष्ट है, धन्यवाद! – m1h4

+2

+1 Google I/O बात के बारे में कई टिप्पणियां हैं, लेकिन बहुत से लोग विकल्प सी का उपयोग नहीं करते हैं। इसे स्पष्ट रूप से सारांशित करने के लिए धन्यवाद। –

+1

झंडे के आधार पर syncToNetwork सेट करना मेरे लिए लापता लिंक था। महान समाधान! –