SQLite और साझा प्राथमिकताएँ के पेशेवरों और विपक्ष [बंद]


156

SQLite डेटाबेस और साझा वरीयताएँ के बीच जानकारी संग्रहीत करने के लिए अच्छा तंत्र क्या है?

साझा प्राथमिकताओं का उपयोग क्यों करें? Sqlite का उपयोग क्यों करें? मैंने उनके बीच अंतर खोजने की कोशिश की, और जो डेटा भंडारण के लिए बेहतर तंत्र है, लेकिन मैं Google पर उचित उत्तर नहीं खोज पा रहा हूं। कृपया उदाहरण और स्पष्टीकरण के साथ मेरी मदद करें।


यह बहुत ज्यादा उस तरह के डेटा पर निर्भर करता है जिसे आप स्टोर करना चाहते हैं। SharedPreferences डेटा की त्वरित और सरल पहुंच की अनुमति देता है, छोटी मात्रा में डेटा रखते समय इसका उपयोग करना अधिक आरामदायक होता है।
ईगोर

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

SharedPreferences पहले उपयोग के बाद मेमोरी में कैश हो जाते हैं, इसलिए उन्हें परिणामी रीड उपयोगों पर बहुत तेज़ होना चाहिए।
स्टेन

जवाबों:


169

यह वास्तव में उस डेटा पर निर्भर करता है जिसे आप स्टोर करना चाहते हैं।

SQLite

एक ही संरचित डेटा की बड़ी मात्रा को SQLite डेटाबेस में संग्रहीत किया जाना चाहिए क्योंकि डेटाबेस इस तरह के डेटा के लिए डिज़ाइन किए गए हैं। चूंकि डेटा को डेटाबेस द्वारा संरचित और प्रबंधित किया जाता है, इसलिए इसे डेटा के उप सेट को प्राप्त करने के लिए क्वियर किया जा सकता है जो SQL जैसी क्वेरी भाषा का उपयोग करके कुछ मानदंडों से मेल खाता है। यह डेटा में खोज करना संभव बनाता है। बेशक डेटा के बड़े सेट को प्रबंधित करना और खोजना प्रदर्शन को प्रभावित करता है इसलिए डेटाबेस से डेटा पढ़ना साझा किए गए डेटा से रीडिंग की तुलना में धीमा हो सकता है।

SharedPreferences

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


24
एक उदाहरण देने के लिए, SharedPreferences उपयोगकर्ता की प्राथमिकताओं को संग्रहीत करने के लिए उपयोगी हैं, जहां बस कुछ मुट्ठी भर चर हैं जिन्हें भंडारण की आवश्यकता है। दूसरी ओर SQLite डेटा संग्रहीत करने के लिए बेहतर होगा जहां एक बड़ी संख्या में आइटम होते हैं, जैसे कि संगीत लाइब्रेरी में गीत शीर्षक जिनके माध्यम से खोज करने की आवश्यकता होती है।
CL22

5
आपको SharedPreferences का उपयोग करने के लिए प्रमुख नामों को जानने की आवश्यकता नहीं है। GetAll देखें ()।
ज़ुलांक

5
FYI करें, एक THIRD विकल्प है: XML को फ़ाइल में पढ़ें / लिखें। (Android.util.xml कक्षाएं देखें)। मध्यम जटिल डेटा के लिए उपयुक्त जिसे एक ही बार में पढ़ा / लिखा जा सकता है। उदाहरण के लिए, मूल्यों का एक ग्रिड जो उपयोगकर्ता अक्सर बदलता नहीं है। विशेष रूप से अगर यह ऐसा डेटा है जिसे आप बाद में कहीं और भेजना चाहते हैं, तो एक पार्स करने योग्य प्रारूप में आवश्यकता होगी।
टूलमेकरसैट

1
क्या साझा प्रीफ़ में json स्ट्रिंग के रूप में किसी जोंस को सहेजना उचित है?
केवेश कंवल

2
@JCarlos जब तक आप कुछ क्रॉस प्रोसेस सामान नहीं कर रहे हैं, आप SharedPreferences का उपयोग करके ठीक हो जाएंगे।
Mygod

97

इस सवाल का एक स्वीकृत उत्तर है, लेकिन मुझे लगता है कि इस विषय पर और भी कुछ कहा गया है - गति के संबंध में।

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

इसलिए, यदि डेटा की प्रकृति आपकी पसंद को निर्धारित नहीं करती है (जैसा कि स्वीकृत उत्तर में समझाया गया है), और गति मायने रखती है, तो आप शायद SharedPreferences का उपयोग करने के लिए बेहतर हैं।

और कुछ डेटा को पढ़ना मुख्य गतिविधि को प्रदर्शित करने के लिए अक्सर महत्वपूर्ण पथ पर होता है, इसलिए मुझे लगता है कि गति अक्सर बहुत महत्वपूर्ण होती है।

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


6
कोड पठनीयता के बारे में क्या? मुझे लगता है कि जब एक db टेबल के बजाय SharedPrefs में कई रिकॉर्ड संग्रहीत करते हैं, तो कोड जटिल हो जाता है। Sql सिंटैक्स साझा करने के लिए साझा करने से ज़्यादा आसान है रीडरेप्स एंट्री ...
इगोरगानपोलस्की

8
इगोर, मैं असहमत था। SharedPreferences वास्तव में 1-आयामी हैं, यह एक वरीयता का उपयोग करने के लिए बहुत सीधा है। उदाहरण के लिए, मैं एक स्टॉक चेकिंग ऐप बना रहा हूं, मैं केवल स्टॉक के प्रतीकों को प्राथमिकता में रख रहा हूं। मुझे उन्हें व्यक्तिगत रूप से हथियाने की जरूरत नहीं है, क्योंकि मैं हमेशा उन सभी को सूचीबद्ध करता हूं, और यह सब मैं करता हूं, स्टोर करता हूं या हड़पता हूं। यह एक DB का उपयोग करने की तुलना में बहुत सरल, बहुत सरल है।
ऑटोएम

1
मैं ऐसी स्थिति के बारे में नहीं सोच सकता, जहां कोड की पठनीयता मुश्किल हो जाती है, जबकि डेटा की संरचना को बचाया जाना एक पदानुक्रमित डेटाबेस के उपयोग की मांग नहीं करता है। यहां तक ​​कि अगर कोई पठनीयता मुद्दे हैं, तो इसे आवश्यक कार्यों के साथ एक आवरण वर्ग का उपयोग करके हल किया जा सकता है।
सारथ सदाशिवन पिल्लई

1
क्या हम साझा प्राथमिकताओं के तहत jsonstring डेटा के रूप में कई कुंजी-मूल्य संग्रहीत कर सकते हैं? क्या कोई चरित्र सीमा है जो मेरे मान को छोटा कर सकती है?
नोवा

2
SharedPreferences को केवल एक बार मेमोरी में लोड किया जाता है (ऐप प्रक्रिया के अनुसार जीवन चक्र) और वहां रखा जाता है; उसके बाद यह हमेशा सुपर फास्ट है। तो वास्तव में किसी भी व्यावहारिक प्रदर्शन को SQLite में साझा करने से जीत नहीं है (सिर्फ अतिरिक्त SharedPref फ़ाइल एक्सेस से बचने के लिए)। और वैसे भी आपको अपने SQLite सामान को SharedPrefs में नहीं डालना चाहिए; जैसा कि मैंने कहा, यह हमेशा स्मृति में होता है जिससे आपको समस्याएं हो सकती हैं (आउट-ऑफ-मेमोरी वाले)।
Zsolt Safrany

20

मेरा टेक है, यह गति या आकार के बारे में नहीं है, लेकिन जिस प्रकार का ऑपरेशन आप अपने डेटा पर करना चाहते हैं।

आप करते हैं की योजना है में शामिल होने , प्रकार , और अन्य डीबी संचालन अपने डेटा पर तब के लिए जाना SQLite । एक उदाहरण दिनांक के अनुसार डेटा सॉर्ट कर रहा है।

यदि आप सरल मूल्यों (जैसे इंट, बूलियन, स्ट्रिंग) को मैप करना चाहते हैं तो प्राथमिकताएं उपयोग करें । DB ऑपरेशंस यहां काम नहीं करेंगे और यह कहने के लिए कि आपको सभी कुंजियों की आवश्यकता है। एक उदाहरण उपयोगकर्ता पासवर्ड या ऐप कॉन्फ़िगरेशन है।

प्राथमिकता को गले लगाने का बड़ा प्रलोभन तब होता है जब आप स्ट्रिंग के रूप में एक चपटा POJO (क्रमबद्ध JSON ऑब्जेक्ट) स्टोर करने के लिए इसका उपयोग करना चाहते हैं। ऐसी आवश्यकता होना वास्तव में Sqlite का उपयोग करने का संकेत है। क्यों ? क्योंकि जटिल डेटा को अंततः जटिल oprations की आवश्यकता होगी। एक विशिष्ट प्रविष्टि प्राप्त करने की कल्पना करें जिसे एक सरल "SELECT ... WHERE आईडी = 1" द्वारा संभाला जा सकता है। प्राथमिकताएं पथ में, परिणामों को पुनरावृत्त करने के लिए deserializing से यह एक लंबी प्रक्रिया होगी।


इसके अलावा, SharedPreferences लेनदेन का समर्थन नहीं करता है, इसलिए यदि आपको लेनदेन की आवश्यकता है, तो SQLite का उपयोग करें। उदाहरण के लिए, यदि उपयोगकर्ता "लॉग आउट" बटन दबाता है, तो आप SharedPreferencesएक ही बार में कई कुंजी / मान साफ़ कर सकते हैं (उदाहरण दोनों userऔर passwordकुंजियाँ), ताकि आप सुनिश्चित हों कि या तो दोनों कुंजी असंतुष्ट हैं या दोनों सेट हैं।
रन

5
  • भारी मात्रा में डेटा संग्रहीत करने के लिए, SQLite डेटाबेस सिस्टम के लिए जाएं। यह उपयोगकर्ता को डेटा के लिए भी खोज करने की अनुमति देगा।

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


1
300 कुंजी-मूल्य जोड़े डेटा की एक बड़ी राशि है? मुझे इसे बिल्कुल स्टोर करने की आवश्यकता है।
JCarlosR

1
उस स्थिति में, आपको SQLite डेटाबेस के लिए जाना चाहिए। अन्यथा, उन 300 डेटा को प्रबंधित करना और पुनः प्राप्त करना कठिन होगा।
सामी अल-जबर

लेकिन अगर सभी चाबियाँ ज्ञात हैं तो साझा वरीयताएँ से डेटा प्राप्त करना आसान नहीं होगा?
अर्जुन

-6

SQLLite को साझा करें साझा करना भूल जाएं, दायरे का उपयोग करें। आपके सभी स्थानीय भंडारण के लिए एक एकल समाधान। आप सादे पुराने Java ऑब्जेक्ट को RealmObjects के रूप में उपयोग कर सकते हैं और अपने डेटा को वहां संग्रहीत कर सकते हैं। आप JSON फ़ाइलों में selcted क्वेरीज़ को कनवर्ट कर सकते हैं। संपूर्ण डेटा बेस को पार्स करने की आवश्यकता नहीं है। इस लिंक की जाँच करें: https://realm.io/news/introducing-realm/


12
सब कुछ आप भूल जाते हैं के बारे में पता है।
एंड्रयू जी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.