2012-01-09 9 views
15

मैं एक एंड्रॉइड ऐप लिख रहा हूं जिसे किसी दिए गए SQLite डेटाबेस में परिवर्तन होने पर अधिसूचित करने की आवश्यकता होती है (कोई भी नई पंक्ति जोड़ी, हटाई जाती है या अपडेट की जाती है)।एंड्रॉइड एसक्यूएलएट डीबी नोटिफिकेशन

क्या इन अधिसूचनाओं को सुनने के लिए कोई प्रोग्रामेटिक तरीका है?

क्या प्रत्येक तालिका के लिए डीबी ट्रिगर लिखना एकमात्र तरीका है?

+0

SQLLite डेटाबेस ऑपरेशंस केवल आपके ऐप से हैं (या) कहीं से भी हो सकते हैं? – kosa

उत्तर

5

SQLite Data Change Notification Callbacks प्रदान करता है। मुझे नहीं लगता कि एंड्रॉइड उन्हें सीधे दिखाता है लेकिन उदाहरण के लिए CursorAdapter है जो कुछ बदलाव अधिसूचनाएं प्रदान करता है।

जैसा कि विचारधारा ने पूछा था, क्या आप उम्मीद करते हैं कि आपके डीबी को अपने आवेदन के दायरे से बाहर बदला जाए?

+0

जैसा कि थिंकस्टीप ने पूछा था, क्या आप उम्मीद करते हैं कि आपके डीबी को अपने आवेदन के दायरे से बाहर बदला जाए? बहुत उपयोगी नोटिस –

+1

कर्सर एडाप्टर क्या परिवर्तन सूचनाएं प्रदान करता है? –

+0

कर्सर एडाप्टर की अधिसूचनाएं एंड्रॉइड सामग्री पर आधारित हैं जो डेटाबेस परिवर्तनों से सीधे संबंधित नहीं हैं। जब डेटाबेस बदलता है तो उस तंत्र को सूचित करने के लिए प्रोग्रामर पर निर्भर करता है। –

1

आप तो एक पर्यवेक्षक वर्ग जैसे DataSetObserver

रजिस्टर जब भी आप कुछ आप परिवर्तनों का निरीक्षण रजिस्टर करने के लिए cursor.registerDataSetObserver(..) कॉल कर सकते हैं बदल सकते हैं।

यह अच्छी तरह से प्रलेखित नहीं है, लेकिन मुझे यकीन है कि वहाँ बाहर

+1

जो मैं समझता हूं, कर्सर डेटा का एक स्नैपशॉट प्रदान करता है। इसका अर्थ यह है कि जब तक आप डेटा को दोबारा पूछ नहीं लेते, श्रोता को नहीं बुलाया जाएगा। प्रलेखन से: "* एक पर्यवेक्षक को पंजीकृत करें जिसे इस कर्सर डेटा सेट की सामग्री में परिवर्तन होने पर कहा जाता है, उदाहरण के लिए, जब डेटा सेट को requery(), निष्क्रिय करें(), या बंद() के माध्यम से बदला जाता है। *" –

+0

यह तब ट्रिगर होता है जब प्रोग्रामर सामग्री प्रदाता को कॉल करता है। नोटिफ़ाई बदलें, और परिवर्तनों का स्वतः पता नहीं लगाता है। –

0
एक

तुम भी उपयोग कर सकते हैं getContentResolver().registerContentObserver का उपयोग लेकिन दुर्भाग्य से यह आपको बता नहीं पड़ता कि परिवर्तन की तरह बनाया गया था, यह हो सकता है कुछ उदाहरण देखते हैं कि कर रहा हूँ हटाएं, डालें या अपडेट करें।

यदि आप सामग्री प्रदाता को नियंत्रित करते हैं जो डीबी के साथ इंटरफेस करता है तो आप एक इरादा को आग लग सकते हैं या getContentResolver().notifyChange का उपयोग एक विशेष उरी अधिसूचना भेजने के लिए कर सकते हैं जो तालिका और क्रिया दोनों को पहचानता है। एक उदाहरण यूरी जिसे आप अधिसूचित कर सकते हैं: content://my-authority/change/table-name/insert

लेकिन फिर भी आपको नहीं पता कि परिवर्तन से कौन सी पंक्तियां प्रभावित हुईं।

एक परिवर्तन लॉग तालिका में लिखने वाले ट्रिगर की तरह लगता है कि आप कहां से आए थे, इस पर ध्यान दिए बिना सभी परिवर्तनों के बारे में सुनेंगे, और आप सटीक आईडी और कार्रवाई को जान सकते हैं। दुर्भाग्यवश इसका मतलब धीमा आवेषण/अद्यतन/हटाना है और इसका मतलब है कि आपको परिवर्तनों को संसाधित करने और हटाने के लिए शायद किसी प्रकार की सेवा की आवश्यकता है।

मुझे यह सुनना अच्छा लगेगा कि क्या यह कुछ बेहतर समाधान है!