2012-12-19 12 views
7

मुझे Android पर SQLite डेटाबेस हैंडलिंग के लिए पिछड़ा संगतता, जटिलता और सर्वोत्तम अभ्यास अनुकूलित करने में कठिनाई हो रही है।एंड्रॉइड पर SQLite टेबल और कर्सर को संभालना

  • सीधे android.database.sqlite
  • ContentProvider, CursorLoader और LoaderManager

मैं डेटाबेस कार्यान्वयन भविष्य डिजाइन करने के लिए कोशिश कर रहा हूँ के माध्यम से : मैं SQLite डेटाबेस का प्रबंधन करने के दो नहीं पदावनत तरीके और कर्सर पाया प्रमाण। इसका मतलब है कि मैं Google द्वारा प्रचारित सर्वोत्तम अभ्यास को कार्यान्वित करना चाहता हूं। ContentProvider और LoaderManager को लागू करने पर।

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

android.database.sqlite के माध्यम से डेटाबेस और कर्सर की डायरेक्ट हैंडलिंग संसाधन प्रबंधन के साथ समस्याएं उकसा रही है (अपने कर्सर बंद करें!) और मुझे कार्य संचालन के लिए जिम्मेदार बनाता है।

मेरे सवाल:
Android पर आप कैसे संभाल रहे हैं SQLite डेटाबेस?
आप अतिरिक्त मील कब जाते हैं और ContentProvider और LoaderManager लागू करते हैं?
आप पीछे की ओर संगत कैसे रहते हैं?

मेरे वर्तमान दृष्टिकोण:
मैं एक वर्ग है कि अलग करती डेटाबेस आई/ओ (android.database.sqlite के माध्यम से) गतिविधियों से बनाया। सभी विधियां उनके निष्पादन (मेरी गतिविधियों के बाहर) के दौरान उपयोग किए जाने वाले कर्सर को खोलें और बंद करें और ऑब्जेक्ट या डेटा को आवश्यकतानुसार लौटाएं (कर्सर की बजाय)। I/O संचालन AsyncTasks में किया जाता है। यह दृष्टिकोण बहुत बहिष्कृत लगता है।

+0

मेरे पास उन सभी चीजों का उत्तर नहीं है लेकिन मुझे पता है कि समर्थन लाइब्रेरी लोडर के साथ 2.1 तक वापस काम करती है। –

उत्तर

4

मुझे हाल ही में एक ही सादा वर्ग/सामग्री प्रदाता दुविधा थी, और ऐसा लगता है कि समस्या प्रदाता को हल करने के लिए सामग्री प्रदाता सबसे आम दृष्टिकोण है।

यहां तक ​​कि अगर official doc कहा गया है कि

यदि आप अन्य अनुप्रयोगों

वे करने का विकल्प जोड़ा साथ अपना डेटा साझा करने का इरादा नहीं है अपने स्वयं के प्रदाता को विकसित करने की जरूरत नहीं है unexported सामग्री

android:exported="false" 

सभी किताबें मैंने पढ़ा है, रीटो मायर के पी सहित का उपयोग कर प्रदाताओं है rofessional एंड्रॉइड विकास 4, सामग्री प्रदाताओं का उपयोग करने का सुझाव देते हैं।

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

वैसे भी, मुझे यह कहना है कि सामग्री प्रदाता/कर्सर लोडर कॉम्बो से आपको प्राप्त होने वाला सबसे बड़ा लाभ यह है कि जब भी अंतर्निहित डेटा बदलता है तो आपका लोडर स्वचालित रूप से अधिसूचित हो जाता है।

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

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

निष्कर्ष:

  • यदि आप अन्य एप्लिकेशन के लिए अपने डेटा (इतना आम नहीं), आप अगर आप का पालन करना चाहते हैं सामग्री प्रदाता
  • के लिए जाने की जरूरत है निर्यात करना चाहते हैं डेटा/अपडेट करें क्योंकि आपके डेटासेट को पृष्ठभूमि में बदला जा सकता है, सामग्री प्रदाता + लोडर बेहद शक्तिशाली
  • यदि आपके पास प्रीलोड किए गए डेटा सेट हैं, और हो सकता है कि आप इसे उसी गतिविधि में अपडेट करें जो डेटा प्रदर्शित करता है, या आपको आवश्यकता है अपने टा के साथ सरल संचालन करने के लिए ब्लेस, हो सकता है कि एक स्क्लेइट हेल्पर क्लास पर्याप्त है
+0

सही जवाब, पढ़ने के बाद मैंने आखिरकार कंटेंटप्रोवाइडर में जाने का निर्णय लिया, न केवल आपकी अत्यधिक मददगार स्क्रिप्ट के कारण! मैंने एक स्क्रिप्ट भी लिखने के बारे में सोचा, लेकिन फिर इस सवाल में ContentProvider के बारे में सोचने का फैसला किया, इसलिए अपने कर्म के लिए +1 :) – mrcktz

+2

सहायक होने के लिए खुशी हुई। आप यहां मेरी व्यक्तिगत रेंट पा सकते हैं http://mytechaddiction.blogspot.com/2012/11/android-content-providers-generator.html – fedepaol

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