एक ContentProvider एक डेटाबेस
एक ContentProvider एक तरीका है नहीं है सामग्री के रूप में सार्वजनिक रूप से (या अर्द्ध सार्वजनिक रूप से) डेटा एक्सेस करने हेतु। यह फ़ाइल एक्सेस, SQLite या यहां तक कि वेब एक्सेस के माध्यम से कई तरीकों से किया जा सकता है। एक सामग्री प्रदाता अपने आप में और डेटाबेस नहीं है, लेकिन आप इसके लिए डेटाबेस प्रोग्राम कर सकते हैं। आपके पास एक ही डेटाबेस तक पहुंचने वाले एकाधिक सामग्री प्रदाता भी हो सकते हैं, लेकिन अनुरोधकर्ता के अनुसार विभिन्न तरीकों से पहुंच के विभिन्न स्तरों को वितरित कर सकते हैं, या एक ही सामग्री को वितरित कर सकते हैं।
जो आप वास्तव में पूछ रहे हैं वह सामग्री प्रदाता प्रश्न नहीं है, लेकिन डेटाबेस प्रश्न "SQLite डेटाबेस में संबंधों को कैसे प्रबंधित करें" क्योंकि ContentProvider किसी भी डेटाबेस कोड का उपयोग नहीं करता है जब तक कि आप इसे SQLiteOpenHelper
और अन्य समान के माध्यम से नहीं बताते कक्षाएं। इसलिए, आपको बस अपने डेटाबेस का उपयोग सही तरीके से प्रोग्राम करना होगा और आपका SQLite डेटाबेस वांछित के रूप में काम करेगा।
एक डेटाबेस एक डेटाबेस
पुराने दिनों में है, डेटाबेस बस फ्लैट फ़ाइलें जहां हर तालिका अक्सर विकास के लिए अनुमति देने के लिए अपनी ही इकाई थी। अब, डीबीएमएस के साथ, ऐसा करने के लिए बहुत कम कारण है। SQLite इस संबंध में किसी अन्य डेटाबेस प्लेटफ़ॉर्म की तरह है और आपके पास पकड़ने के लिए स्थान होने के रूप में कई तालिकाओं को घर बना सकता है।
SQLite
कुछ है कि यह संभालती कुछ सुविधाओं है कि SQLite अच्छी तरह से हैंडल कर रहे हैं, - लेकिन अच्छी तरह से, और कुछ यह बिल्कुल संभाल नहीं है। रिश्ते उन चीजों में से एक हैं जो एंड्रॉइड के SQLite के कुछ संस्करणों से बाहर थे, क्योंकि यह विदेशी कुंजी समर्थन के बिना भेज दिया गया था। यह एक अत्यधिक अनुरोधित सुविधा थी और इसे SQLite 3.6.22 में जोड़ा गया था जो Android 2.2 तक शिप नहीं किया गया था। इसके बावजूद अभी भी कई रिपोर्ट की गई बग हैं, हालांकि, इसके शुरुआती अवतारों में।
एंड्रॉयड पूर्व 2.2
एसक्यूएल शुक्र है किया जा रहा अनुरूप और एक सरल डीबीएमएस (इस समय नहीं RDBMS), वहाँ इस के आसपास काम करने के लिए कुछ आसान तरीके हैं, सब के बाद, एक विदेशी कुंजी बस में एक क्षेत्र है एक और टेबल
- आप ऐसा अपने
CREATE TABLE
कथन का उपयोग CONSTRAINT
रों बनाकर डेटाबेस INSERT
और UPDATE
बयान लागू कर सकते हैं।
- आप अपनी विदेशी कुंजी प्राप्त करने के लिए उपयुक्त
_id
के लिए अन्य तालिका से पूछ सकते हैं।
- का उपयोग करके आप किसी भी उपयुक्त
SELECT
कथन के साथ अपनी स्रोत तालिका से पूछ सकते हैं, इस प्रकार एक छद्म संबंध लागू कर सकते हैं।
के बाद से SQLite की Android के संस्करण रिश्तों को सीधे लागू नहीं होता है, यदि आप CASCADE ON DELETE
करना चाहता था आप मैन्युअल रूप से ऐसा करना होगा। लेकिन यह एक और सरल एसक्यूएल कथन के माध्यम से किया जा सकता है। मैंने अनिवार्य रूप से इस तरह के रिश्तों को लागू करने के लिए अपनी खुद की लाइब्रेरी लिखी है, क्योंकि यह सब मैन्युअल रूप से किया जाना चाहिए। मुझे कहना होगा, हालांकि, पूरी तरह से SQLite और SQL की कार्यक्षमता यह बहुत तेज़ और आसान बनाती है।
संक्षेप में, किसी भी लागू की रिश्ते के लिए प्रक्रिया इस प्रकार है:
- एक प्रश्न है कि एक विदेशी कुंजी की आवश्यकता है, एक
JOIN
का उपयोग करें।
- एक
INSERT
में प्राथमिक कुंजी क्षेत्र एक और TABLE
में एक विदेशी कुंजी है कि पर NOT NULL
- के विदेशी कुंजी मैदान पर एक
CONSTRAINT
का उपयोग एक UPDATE
में, संबंधित TABLE
विदेशी कुंजी है कि पर एक दूसरे UPDATE
चलाते हैं। (CASCADE अपडेट)
- एक ही मानकों के साथ एक
DELETE
के लिए, जहां foreign_key = _id
जा रहा है (सुनिश्चित करें कि आप आप DELETE
पंक्ति, पहले से पहले _id
प्राप्त करना) के साथ एक और DELETE
है।
Android 2.2+
विदेशी कुंजी समर्थित है, लेकिन डिफ़ॉल्ट रूप से बंद है। सबसे पहले आप उन्हें चालू करने के लिए है:
db.execSQL("PRAGMA foreign_keys=ON;");
इसके बाद आप संबंध TRIGGER
बनाना होगा। यह तब किया जाता है जब आप अलग TRIGGER
कथन के बजाय TABLE
बनाते हैं। नीचे देखें:
// Added at the end of CREATE TABLE statement in the MANY table
FOREIGN KEY(foreign_key_name) REFERENCES one_table_name(primary_key_name)
SQLite और अपनी क्षमताओं के बारे में अधिक जानकारी के लिए, बाहर SQLite official site की जाँच करें। यह महत्वपूर्ण है क्योंकि आपके पास JOIN
एस नहीं है जो आप अन्य आरडीबीएमएस में करते हैं। एंड्रॉइड में SQLite कक्षाओं पर विशिष्ट जानकारी के लिए, the documentation पढ़ें।
क्या आप "मैन्युअल रिश्तों को कैसे संभालें" के साथ क्या मतलब है, इसके बारे में कुछ और जानकारी प्रदान कर सकते हैं क्या आप एसक्यूएल डाटाबेस डिज़ाइन के बारे में बात कर रहे हैं, स्टेटमेंट बनाएं या आप सोच रहे हैं कि सामग्री प्रदाता पक्ष पर इसे कैसे किया जाए। – AGrunewald