2010-08-30 15 views
5

मेरे पास डेटा एक्सेस के आसपास एक सामान्य एंड्रॉइड डिज़ाइन प्रश्न है। मेरे पास मेरे एप्लिकेशन में कई गतिविधियां हैं जिन्हें SQLite डेटाबेस तक पहुंचने की आवश्यकता है। एक ही स्थान पर सभी डेटा एक्सेस लॉजिक को लपेटने के लिए मैंने एक डाटाबेस हैंडलर क्लास बनाया है जो सभी डेटा एक्सेस लॉजिक का ख्याल रखता है। यह वर्ग क्वेरी के परिणाम पुनर्प्राप्त करने और कॉलर को वापस लाने के लिए डेटाबेस कहकर, परिणामी कर्सर से पूछताछ करने और पूछताछ करने वाले क्लॉज का निर्माण करने का ख्याल रखता है। इस वर्ग का उद्देश्य सभी डेटा एक्सेस कोड को एक ही स्थान पर लपेटना है ताकि सभी गतिविधियों में बिखरे हुए डाटा एक्सेस लॉजिक होने के विरोध में इसे आसानी से प्रबंधित और बनाए रखा जा सके। प्रत्येक गतिविधि जिसे डेटाबेस तक पहुंच की आवश्यकता होती है, इस डेटाबेस हैंडलर क्लास का एक उदाहरण बनाता है और इसे android.content.Context का संदर्भ देता है। इसके बाद डेटाबेस हैंडलर क्लास अंतर्निहित सामग्री प्रदाता को कॉल करने के लिए इस संदर्भ ऑब्जेक्ट का उपयोग करता है जैसा कि context_i.getContentResolver() क्वेरी (...) है।एंड्रॉइड डाटाबेस एक्सेस डिजाइन दृष्टिकोण

मेरा डेटा एक्सेस तर्क (कर्सर हैंडलिंग तर्क विशिष्ट होने के लिए) गतिविधि में नहीं है और इसलिए मैं कर्सर जीवन चक्र का प्रबंधन नहीं कर सकता, इसलिए स्मृति रिसाव होने की संभावना है।

  1. मैं कैसे (इसके भी संभव हो तो) एक गतिविधि बाहर से कर्सर जीवन चक्र प्रबंधन कर सकते हैं -

    मेरे सवालों का इस प्रकार हैं?

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

मैं वास्तव में सर्वोत्तम दृष्टिकोण की समझ प्राप्त करना चाहता हूं। किसी भी सलाह बहुत सराहना की जाएगी

उत्तर

2

मानक दृष्टिकोण:
आम तौर पर अगर आप एक ContentProvider खुद के द्वारा लिखित है और आप अपनी Manifest.xml फ़ाइल में सही ढंग से पंजीकृत, आप बस (उदाहरण के लिए)

कर सकते हैं
@Override 
public void onCreate(Bundle savedInstanceState){ 
    ... 

    if (getIntent().getData() == null) { 
     getIntent().setData(MyMetaData.CONTENT_URI); 
    } 

    Cursor cursor = managedQuery(getIntent().getData(), null, null, null, null); 

    //create an appropriate adapter and bind it to the UI 
    ... 
} 

यह स्वचालित रूप से ContentProvider कि किसी सामग्री URI को प्रबंधित करने में सक्षम है फोन करेगा, यह देखते हुए आप

<provider android:name="MyContentProvider" android:authorities="com.mycompany.contentprovider.MyContentProvider" /> 
तरह Manifest.xml फ़ाइल में यह पंजीकृत 0

मैं हमेशा लोगों को सुझाव देता हूं कि सामग्री प्रदाता को कैसे कार्यान्वित किया जाना चाहिए, यह जानने के लिए Notepad example पर नज़र डालें।

विकल्प:
आम तौर पर, बोल आप मैं "मानक दृष्टिकोण" ContentProviders उपयोग करते हुए, जो btw पर कायम हैं सिर्फ अपनी गतिविधियों से अपना डेटा एक्सेस करने की आवश्यकता है। शायद यह सबसे लचीला समाधान बनाता है।
यदि आपका समाधान को गैर-गतिविधि कक्षाओं से डेटा तक पहुंचने के लिए की आवश्यकता है जहां आपके पास "प्रबंधितQuery" मेटोड नहीं है, तो आप स्वयं को किसी प्रकार की डीएओ (डेटा एक्सेस ऑब्जेक्ट) कक्षाएं लागू कर सकते हैं। एक उदाहरण

public class MyDataDao implements IMyDataDao { 
    private ContentResolver contentResolver; 

    public MyDataDao(ContentResolver contentResolver){ 
     this.contentResolver = contentResolver; 
    } 


    @Override 
    public MyDataObject readMyDataObjectById(long id){ 
     MyDataObject result = null; 

     Cursor myDataObjectCursor = contentResolver.query(...); 
     if(myDataObjectCursor != null && myDataObjectCursor.moveToFirst()){ 
     result = new MyDataObject(); 
     result.setTitle(myDataObjectCursor.get..); 
     ... 
     } 
     myDataObjectCursor.close(); 

     return result; 
    } 
} 

यह भी काम कर सकता है।तब आप अपने डीएओ

IMyDataDao dao = new MyDataDao(context.getContentResolver()); 
MyDataObject anObj = dao.readMyDataObjectById(10); 
... 

आशा है कि आप सही दिशा में इशारा किया :)

+0

आपका जवाब जूरी के लिए धन्यवाद कहते हैं लेकिन मुझे लगता है कि आप शायद सवाल पढ़ने में भूलना। मेरे पास पहले से ही सामग्री प्रदाता और डेटा एक्सेस ऑब्जेक्ट है। (मैंने उन्हें थोड़ा स्पष्ट करने के लिए ऊपर से थोड़ा से प्रश्नों को संशोधित किया है)। 1. मैं (यदि यह भी संभव हो) कर्सर जीवन चक्र को गतिविधि से बाहर (मेरे डेटा एक्सेस ऑब्जेक्ट के अंदर) कैसे प्रबंधित कर सकता हूं? 2. क्या प्रत्येक गतिविधि इस डेटा एक्सेस ऑब्जेक्ट का उदाहरण बना रही है और इसमें संदर्भ का एक उदाहरण गुजर रहा है? शायद डीएओ को स्थैतिक तरीकों का पर्दाफाश करना चाहिए ताकि प्रत्येक गतिविधि को डेटा एक्सेस ऑब्जेक्ट का उदाहरण बनाने की आवश्यकता न हो? – Brian

+0

मैंने गतिविधि के बाहर कर्सर को संभालने के लिए पहले से ही एक उदाहरण प्रदान किया है, यानी आपके डीएओ ऑब्जेक्ट में। बेशक आपको अपने दाओ ऑब्जेक्ट्स के सिंगलटन उदाहरण बनाने पर विचार करना चाहिए, यदि आप अब तक देखभाल करते हैं तो स्थिर लोग यूनिट परीक्षण के लिए आम तौर पर खराब होते हैं। – Juri

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