2010-07-28 16 views
76

के बीच सटीक अंतर मैंने एंड्रॉइड के लिए SQLite डेटाबेस प्रोग्रामिंग किया है, लेकिन मुझे सामग्री-प्रदाता के बारे में कुछ भी पता नहीं है: "जैसा कि मैंने Android Developer page को संदर्भित किया है, एंड्रॉइड एसडीके ने" सामग्री-प्रदाता "के रूप में इसका उपयोग डेटा को स्टोर और पुनर्प्राप्त करने के लिए किया जाता है।""सामग्री-प्रदाता" और "SQLite डेटाबेस"

लेकिन फिर भी,

  1. "सामग्री प्रदाता" और "SQLite डेटाबेस" के बीच सटीक अंतर क्या है?
  2. डेटा स्टोर करने के लिए सबसे अच्छा कौन सा है, कब?

कोई उदाहरण या मदद करता है !!

उत्तर

122

मैं एक बड़ा अंतर पाया को उजागर करता है, इस प्रकार लागू कर सकते हैं:

डेटाबेस में अपना डेटा संग्रहीत करना आपके डेटा को पर कायम रखने का एक अच्छा तरीका है, लेकिन एंड्रॉइड में बनाए गए एंड्रॉइड-डेटाबेस में एक चेतावनी है visible केवल उन्हें बनाए गए एप्लिकेशन के लिए। ऐसा कहने के लिए, एक एप्लिकेशन द्वारा एंड्रॉइड पर बनाया गया एक SQLite डेटाबेस केवल उस एप्लिकेशन द्वारा प्रयोग योग्य है, अन्य अनुप्रयोगों द्वारा नहीं।

तो, यदि आप need to share data between applications, you need to use the content provider model as recommended in Android. यह आलेख सामग्री प्रदाताओं की मूल बातें प्रस्तुत करता है और आप कैसे कार्यान्वित कर सकते हैं।

मैं इस link

सच अच्छा उपलब्ध कराई गई जानकारी पर इस लेख पाया।

+2

ऐसा लगता है कि लिंक अब मर चुका है ... अब लेख नहीं देखें। यदि आप इसे फिर से पाते हैं तो आप जिस आलेख को संदर्भित कर रहे हैं उसे देखना चाहते हैं। – prolink007

+0

फ़र, 11 2012 लिंक [http://www.devx.com/wireless/Article/41133](http://www.devx.com/wireless/Article/41133) पर काम करता है, – k3b

+0

क्या होगा अगर हम में तंत्र प्रदान एक थ्रेड सुरक्षित तरीके से एकाधिक अनुप्रयोगों में डेटा साझा करने की प्रक्रिया? – Manohar

50

"सामग्री प्रदाता" और "SQLite डाटाबेस" के बीच सटीक अंतर क्या है?

ContentProvider एक मुखौटा है - एक एपीआई जिसे आप कार्यान्वित कर सकते हैं जो अन्य प्रक्रियाओं में डेटाबेस का खुलासा करता है। यह को ऐसे तरीके से कार्यान्वित किया जा सकता है जहां डेटा SQLite डेटाबेस में संग्रहीत किया जाता है, लेकिन ऐसा होना आवश्यक नहीं है।

डेटा स्टोर करने के लिए सबसे अच्छा कौन सा है, कब?

अमूर्त में उत्तर देना असंभव है। आम तौर पर, जब तक आपको ContentProvider का उपयोग करने की आवश्यकता नहीं होती है, तो बस डेटाबेस का उपयोग करें।

+25

मैं एक ContentProvider का उपयोग करना पसंद करता हूं क्योंकि यह SQL पर एक बहुत अच्छा अमूर्त है। आप कर्सर एडाप्टर और स्वचालित आवश्यकता के साथ भी अच्छा खेल सकते हैं। – alexanderblom

5

सामग्री प्रदाता का उपयोग तब किया जाता है जब आप अपने डेटा को एप्लिकेशन पर साझा करना चाहते हैं।

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

3

मुख्य अंतर यह है: जब आपके ऐप को अन्य ऐप्स पर जानकारी साझा करने की आवश्यकता होती है, तो सामग्री-प्रदाता का उपयोग करें। एसक्यूलाइट केवल ऐप के लिए भंडारण डेटा जो इसे बनाता है

21

मैंने हजारों उपयोगकर्ताओं के साथ कई अच्छे ऐप्स बनाए हैं जो आसानी से SQLite विधियों का उपयोग करते हैं। लेकिन यह थोड़ी देर पहले था और मुझे मैन्युअल रूप से बहुत सारे कोड लिखना पड़ा था जिसे अब आसानी से ContentProvider द्वारा लिया जा सकता है।उसके बाद मैं सामग्री प्रदाता का उपयोग करने के पक्ष में नहीं था क्योंकि ऐसा लगता है कि कोड में केवल जटिलता ही शामिल है।

हालांकि पिछले कुछ सालों से एंड्रॉइड विकसित हुआ है, इसलिए मैं सामग्री प्रदाता में स्थानांतरित हो गया हूं क्योंकि यह समय बचाता है और आपको और अधिक करने की अनुमति देता है। अब मैं इसे बड़े पैमाने पर उपयोग करता हूं। एक बार आपके पास सामग्री प्रदाता कक्षा लिखी जाने के बाद, आपका जीवन बहुत आसान हो जाता है। ContentProvider के साथ मैं कर्सर लोडर, लोडर कॉलबैक और थोक सम्मिलन के साथ बहुत आसानी से निपट सकता हूं जिसके लिए मुझे अतीत में मैन्युअल रूप से सबकुछ लिखना पड़ा था और फिर भी यह कुशलता से काम नहीं करता था। विशेष रूप से जब सूची दृश्य को अद्यतन करते हैं, जिसे अब स्वचालित रूप से अपडेट किया जाता है, केवल एक अधिसूचना() विधि के लिए धन्यवाद। इसका मतलब है कि अब मुझे अपने स्वयं के श्रोताओं को टाइप करने और सूची दृश्यों और एडेप्टर में सामग्री को मैन्युअल रूप से अपडेट करने की आवश्यकता नहीं है। इसके अलावा, मुझे डेटाबेस खोलने और बंद करने या स्मृति रिसाव के बारे में चिंता करने की चिंता करने की आवश्यकता नहीं है। यह सब सामग्री प्रदाता द्वारा संभाला जाता है। एकमात्र समस्या जो मुझे थोड़ी देर में सामना करती है वह यह है कि आप ContentProviders में कुछ जटिल प्रश्न नहीं उठा सकते हैं। इस मामले में आप अभी भी कच्चे प्रश्नों का उपयोग कर सकते हैं और एसक्लाइट के साथ पुराने फैशन मैनुअल इंटरैक्शन का उपयोग कर सकते हैं।

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

अद्यतन 2017 मैं अब क्षेत्र, किसी भी मंच पर डेटाबेस का उपयोग करने के एक बेहतर तरीका में बदला गया है। इसे सीखने में कुछ घंटे बिताएं, और अपने ऐप विकास कैरियर में अनगिनत घंटे बचाएं।

+0

में तरह डेटाबेस संशोधित नहीं कर सकते मैं सामग्री प्रदाता के लिए अपने कोड में परिवर्तित करने में सोच रहा था, लेकिन अब मैं इसे रखने के बारे में सोच रहा है। –

+0

अब आप एंड्रॉइड –

1

एक अंतर यह है कि सामग्री प्रदाताओं के पास सामग्री पर्यवेक्षकों के लिए प्लेटफॉर्म समर्थन है। आपको SQLite डेटाबेस के लिए अपने स्वयं के अवलोकन पैटर्न को लागू करने की आवश्यकता होगी।

How to automatically re-query with LoaderManager

ContentObserver for SQLite?

8

1. सामग्री प्रदाता थ्रेड नहीं कर रहे हैं सुरक्षित

डिफ़ॉल्ट सामग्री प्रदाताओं द्वारा सुरक्षित थ्रेड नहीं कर रहे हैं। यदि आपके पास सामग्री प्रदाता का उपयोग करके एकाधिक धागे हैं तो आप कई अलग-अलग अपवादों को फेंक रहे हैं और अन्य डेटा विसंगतियों को देख सकते हैं। इसे ठीक करने का सबसे आसान तरीका सामग्री प्रदाता द्वारा उजागर किए गए प्रत्येक सार्वजनिक तरीके पर सिंक्रनाइज़ किए गए कीवर्ड का उपयोग करना है।

इस तरह से एक समय में केवल एक ही थ्रेड इन विधियों तक पहुंच सकता है।

2. प्ले अच्छा जब राईट

मैं नए Serval मैप्स आवेदन में की जरूरत आवेदन के द्वारा आंतरिक रूप से उपयोग डेटाबेस में बाइनरी फ़ाइलें से डेटा आयात करने के लिए है की बहुत सारी कर रही। ऐसा करने के लिए और शेष एप्लिकेशन के साथ अच्छा खेलना सबसे अच्छा है:

आयात करने के लिए एक नया धागा स्पॉन करें ताकि अन्य धागे प्रतिकूल रूप से प्रभावित न हों, विशेष रूप से यूआई को अपडेट करने के प्रभारी धागे; और प्रत्येक आयात के अंत में संक्षिप्त रूप से रोकें ताकि अन्य धागे को सिंक्रनाइज़ किए गए तरीकों का उपयोग करने की आवश्यकता हो।

3।सामग्री प्रदाताओं आप पार्श्व कभी कभी

तरीका है कि एंड्रॉयड के काम में सामग्री प्रदाताओं अपने कोड के बाकी और अंतर्निहित डेटाबेस के बीच अमूर्त की एक परत प्रदान करना है सोचने के लिए मजबूर करते हैं। यह मुख्य रूप से इस तथ्य के कारण है, जहां तक ​​मैं कह सकता हूं, कि सामग्री प्रदाता डेटाबेस के अलावा अन्य स्थानों से डेटा तक पहुंच सकते हैं।

इसका मतलब है कि आप अंतर्निहित डेटाबेस पर कच्चे एसक्यूएल प्रश्नों पर अमल नहीं कर सकते हैं और आप इस तरह क्वेरी विधि के रूप में विभिन्न तरीकों के लिए पारित चर का उपयोग कर एक SQL क्वेरी के विभिन्न घटकों को निर्दिष्ट करने की जरूरत है। यदि आपके पास कोई ऐसा कार्य है जो किसी सामग्री प्रदाता द्वारा एसक्यूएल को संभालने के तरीके में फिट नहीं होता है, तो आपके पास दो विकल्प हैं:

बाद में क्वेरी के बारे में सोचें, शायद आप वैकल्पिक प्रश्नों और एक्सेसिंग के जरिए डेटा प्राप्त कर सकते हैं कर्सर से परिणाम; और आम तौर पर डेटा तक पहुंचने के लिए एक यूआरआई का उपयोग करें और एक विशेष यूआरआई जो उन कार्यों के लिए एक विशिष्ट क्वेरी से मेल खाती है जिनके पास विकल्प नहीं हैं।

2

मैं this answer पढ़ा, जबकि एक ही संदेह की तलाश में है, इसलिए इसे साझा करने के बारे में सोचा। यह बताता है -

आंतरिक डेटा को बदलने में आसान बनाने के लिए अपने डेटा पर अबास्ट्रक्शन का अतिरिक्त स्तर प्रदान करना अच्छा अभ्यास है। क्या होगा यदि आप बाद में डेटाबेस संरचना को बदलने का निर्णय लेते हैं? यदि आप ContentProvider का उपयोग करते हैं तो आप इसके भीतर सभी संरचनात्मक परिवर्तनों को शामिल कर सकते हैं, जहां आप एक का उपयोग नहीं करते हैं, तो आपको संरचनात्मक परिवर्तनों से प्रभावित कोड के सभी क्षेत्रों को बदलने के लिए मजबूर होना पड़ता है। इसके अलावा, डेटाबेस में निम्न-स्तर तक पहुंच के साथ अपने कोड को कूड़ेदान के बजाय डेटा तक पहुंचने के लिए समान मानक API का पुन: उपयोग करने में सक्षम होना अच्छा लगता है।

तो, सामग्री प्रदाता का उपयोग करना एक अच्छा विचार होगा। उन्नत सामग्री प्रबंधन प्रणाली के

3

Think। प्रत्येक ऑब्जेक्ट (पृष्ठ, छवि, समाचार आलेख, ईवेंट आइटम इत्यादि) में एक सामग्री, पता, उपयोगकर्ता अनुमतियां, और सिस्टम के विभिन्न हिस्सों से इसके साथ बातचीत करने के तरीके हैं। सामग्री प्रदाता एंड्रॉइड के लिए ऐसा करते हैं। अब आप अपने एप्लिकेशन में संग्रहीत फ़ाइलों या छवियों को साझा कर सकते हैं। आप कस्टम sharable ऑब्जेक्ट्स भी बना सकते हैं, जैसे bussiness संपर्क, संपादन योग्य नोट्स इत्यादि। और जब आप उन्हें किसी अन्य एप्लिकेशन से खोलते हैं तो ऐसी ऑब्जेक्ट से निपटने के लिए सुरक्षा और डिफ़ॉल्ट एप्लिकेशन निर्दिष्ट करें।

+0

की 'कक्ष' लाइब्रेरी भी जोड़ सकते हैं यह एक अच्छा बिंदु है! –

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