2011-09-21 8 views
10

SQLite डेटाबेस का उपयोग के लिए एक सामग्री प्रदाता का उपयोग करते समयएंड्रॉयड: प्रत्येक तालिका के लिए ContentProvider/एक-से-कई रिश्तों को संभालने

  1. बेहतर अभ्यास है हर तालिका के लिए एक सामग्री प्रदाता के लिए या सभी के लिए एक का उपयोग करने टेबल?
  2. नए रिकॉर्ड बनाते समय एक से कई रिश्तों को कैसे संभालें?
+0

क्या आप "मैन्युअल रिश्तों को कैसे संभालें" के साथ क्या मतलब है, इसके बारे में कुछ और जानकारी प्रदान कर सकते हैं क्या आप एसक्यूएल डाटाबेस डिज़ाइन के बारे में बात कर रहे हैं, स्टेटमेंट बनाएं या आप सोच रहे हैं कि सामग्री प्रदाता पक्ष पर इसे कैसे किया जाए। – AGrunewald

उत्तर

15

एक ContentProvider एक डेटाबेस

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

जो आप वास्तव में पूछ रहे हैं वह सामग्री प्रदाता प्रश्न नहीं है, लेकिन डेटाबेस प्रश्न "SQLite डेटाबेस में संबंधों को कैसे प्रबंधित करें" क्योंकि ContentProvider किसी भी डेटाबेस कोड का उपयोग नहीं करता है जब तक कि आप इसे SQLiteOpenHelper और अन्य समान के माध्यम से नहीं बताते कक्षाएं। इसलिए, आपको बस अपने डेटाबेस का उपयोग सही तरीके से प्रोग्राम करना होगा और आपका SQLite डेटाबेस वांछित के रूप में काम करेगा।

एक डेटाबेस एक डेटाबेस

पुराने दिनों में है, डेटाबेस बस फ्लैट फ़ाइलें जहां हर तालिका अक्सर विकास के लिए अनुमति देने के लिए अपनी ही इकाई थी। अब, डीबीएमएस के साथ, ऐसा करने के लिए बहुत कम कारण है। SQLite इस संबंध में किसी अन्य डेटाबेस प्लेटफ़ॉर्म की तरह है और आपके पास पकड़ने के लिए स्थान होने के रूप में कई तालिकाओं को घर बना सकता है।

SQLite

कुछ है कि यह संभालती कुछ सुविधाओं है कि SQLite अच्छी तरह से हैंडल कर रहे हैं, - लेकिन अच्छी तरह से, और कुछ यह बिल्कुल संभाल नहीं है। रिश्ते उन चीजों में से एक हैं जो एंड्रॉइड के SQLite के कुछ संस्करणों से बाहर थे, क्योंकि यह विदेशी कुंजी समर्थन के बिना भेज दिया गया था। यह एक अत्यधिक अनुरोधित सुविधा थी और इसे SQLite 3.6.22 में जोड़ा गया था जो Android 2.2 तक शिप नहीं किया गया था। इसके बावजूद अभी भी कई रिपोर्ट की गई बग हैं, हालांकि, इसके शुरुआती अवतारों में।

एंड्रॉयड पूर्व 2.2

एसक्यूएल शुक्र है किया जा रहा अनुरूप और एक सरल डीबीएमएस (इस समय नहीं RDBMS), वहाँ इस के आसपास काम करने के लिए कुछ आसान तरीके हैं, सब के बाद, एक विदेशी कुंजी बस में एक क्षेत्र है एक और टेबल

  1. आप ऐसा अपने CREATE TABLE कथन का उपयोग CONSTRAINT रों बनाकर डेटाबेस INSERT और UPDATE बयान लागू कर सकते हैं।
  2. आप अपनी विदेशी कुंजी प्राप्त करने के लिए उपयुक्त _id के लिए अन्य तालिका से पूछ सकते हैं।
  3. का उपयोग करके आप किसी भी उपयुक्त 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 पढ़ें।

+0

क्या एक क्रैकिंग जवाब, धन्यवाद।मैं कई डेटाबेस (MySQL, MSSQL, Postgres, Ingres, SQLite को कुछ और कई भाषाओं का नाम देने के लिए परिचित हूं) लेकिन यह मेरा पहला एंड्रॉइड ऐप है और मैं वास्तव में स्वीकार करने की परवाह करता हूं, मैं जावा के बारे में और अधिक भूल गया हूं, मैं वास्तव में एंड्रॉइड विशिष्ट वाक्यविन्यास के साथ संघर्ष कर रहा हूं और मुझे अपने प्रश्न में यह स्पष्ट होना चाहिए था, लेकिन आपने मेरे ज्ञान में कुछ गंभीर अंतराल पर प्रकाश डाला है, खासकर एफके पर स्विच करना। मैं आपका जवाब स्वीकार करूंगा क्योंकि अब मेरे पास वाक्यांश के लिए अधिक विशिष्ट प्रश्न हैं और मुझे यकीन है कि दूसरों को यह बेहद उपयोगी लगेगा। धन्यवाद फिर से – jamesc

+0

आपका स्वागत है। आपका भी धन्यवाद। –

5

पहले प्रश्न के रूप में: आपको प्रत्येक तालिका के लिए सामग्री प्रदाता बनाने की आवश्यकता नहीं है। आप कई तालिकाओं के साथ उपयोग कर सकते हैं, लेकिन प्रदाता की जटिलता प्रत्येक तालिका के साथ बढ़ी है।

+0

धन्यवाद, मैं आपके प्रश्न को उत्तर के रूप में चिह्नित नहीं करना चाहता क्योंकि मेरे पास मेरे सभी सवालों के जवाब नहीं हैं लेकिन आपकी जानकारी की बहुत सराहना की जाती है – jamesc

+0

आपका स्वागत है। –

1

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

कई रिश्तों में से एक को किसी अन्य डेटाबेस की तरह ही संभाला जा सकता है। किसी भी अन्य डेटाबेस के साथ संदर्भ और विदेशी कुंजी का उपयोग करें। आप यह सुनिश्चित करने के लिए CASCADE ON DELETE जैसी चीजों का उपयोग कर सकते हैं ताकि रिकॉर्ड हटा दिए जाएं जब वे अन्य तालिकाओं में संदर्भित रिकॉर्ड भी हटा दिए जाते हैं।

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