2011-07-07 17 views
44

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

डीबी से कनेक्शन कैसे संभालें? क्या मुझे इसे प्राप्त करने के बाद इसे बंद करना चाहिए या क्या इसे ऐप बंद होने तक इसे पूरे समय खोलना चाहिए? मैं जानना चाहता हूं कि प्रदर्शन और बैटरी जीवन के बारे में सोचते समय सबसे अच्छा तरीका क्या है।

+1

यहां महान स्पष्टीकरण .. http://stackoverflow.com/questions/14002022/android-sq-lite-closed-exception/25379071#25379071 – Nepster

उत्तर

4

डेटाबेस से कनेक्शन स्थापित करना महंगा है। यदि कनेक्शन कम आपूर्ति में नहीं हैं, और डेटाबेस स्थानीय है, तो मैं डेटाबेस को प्रत्येक लेखन ऑपरेशन के लिए स्थापित करने के बजाय कनेक्शन को खोलता हूं, क्योंकि आप आमतौर पर क्लाइंट-सर्वर एप्लिकेशन में करते हैं जिसे स्केल करने की आवश्यकता होती है समवर्ती उपयोगकर्ताओं की एक बड़ी संख्या को समायोजित करें।

+1

हां मैंने पाया कि उद्घाटन महंगा हो सकता है। तो अगर मैं आपको अच्छा समझता हूं तो मुझे कनेक्शन को खुला रखना चाहिए। लेकिन क्या होगा यदि उपयोगकर्ता होम स्क्रीन पर जाएंगे। क्या मुझे इसे रोकें() में और फिर से शुरू करें()? मैं इसे इरादों के बीच कैसे पारित कर सकता हूं? – Fixus

3

सामान्य रूप से मैं कनेक्शन खोलने वाले गतिविधि के ऑनस्ट्रोय() फ़ंक्शन में कनेक्शन बंद कर दूंगा। मैं कर्सर का उपयोग करने वाले फ़ंक्शन में किसी डेटाबेस से कर्सर को बंद कर दूंगा।

public MyActivity extends Activity{ 
    private myDatabase mDatabase; // myDatabase extends SQLiteOpenHelper 
    private Cursor mCursor; 

    public MyActivity(Context context){ 
     super(context); 
     initMemberVariables(); 
    } 

    public ElementButton(Context context, AttributeSet attrS){ 
    super(context, attrS); 
     initMemberVariables(); 
    } 

    public ElementButton(Context context, AttributeSet attrS, int defStyle){ 
     super(context, attrS, defStyle); 
     initMemberVariables(); 
    } 

    private void initMemberVariables(){ 
     mDatabase = new PSEdb(this.getContext()); 
    } 

    private void getData(){ 
     mCursor = mDatabase.MyGetterFunction(); 
     while(mCursor.moveToNext()){ 
      try{ 
       // populate your data 
      }catch(CursorIndexOutOfBoundsException ex){ 
       // handle the exception 
      } 
     } 
     mCursor.close(); 
    } 

    @Override 
    public void onDestroy(){ 
     super.onDestroy(); 
     mDatabase.close(); 
    } 
} 
94

this post by a Google engineer (Dianne Hackborn) के अनुसार, वहाँ डेटाबेस कनेक्शन खुला छोड़ के साथ कुछ भी गलत नहीं:

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

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

फिर, इसे बंद करने के बारे में चिंता न करें।

+2

क्विक फिक्स के लिए यह अच्छा जवाब है, लेकिन शायद यह अच्छा प्रोग्राम प्रवाह और सभी योजनाओं के पहले बेहतर करके किया जा सकता है। –

+5

@ जानिस ग्रुज़िस कुछ विकल्प जो हमेशा काम करता है उससे बेहतर "बेहतर" होगा, और यह बेहद सरल है? –

+2

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

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

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