2011-12-16 16 views
12

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

लेकिन मेरे एंड्रॉइड फोन (एचटीसी जी 13) में से एक में, मुझे निर्देशिका/डेटा/डेटा/[पैकेज नाम]/डेटाबेस में * .db-wal फ़ाइल मिली। और ContentProvider के साथ परिचालन करते समय फ़ाइल का आकार बहुत तेज हो जाता है। यह उपयोगकर्ता रैम स्पेस पर बहुत अधिक कब्जा कर लिया।

पोस्ट enter link description here में मेरी समस्या (यह उपयोगी है) को हल करने के लिए SQLiteOpenHelper को बंद करने की अनुशंसा की जाती है।

लेकिन मैं "करीबी()" विधि जोड़ने के लिए "स्थान" ढूंढना चाहता हूं क्योंकि मैं सीधे SQLiteOpenHelper (ContentProvider के माध्यम से उपयोग नहीं कर रहा हूं) का उपयोग नहीं कर रहा हूं। ContentProvider में क्वेरी() विधि को कर्सर वापस करना होगा, और SQLiteDatabse को खुली स्थिति में रहना चाहिए।

मैं उलझन में हूं, मैं अब * डीडी-वाल को रखने के लिए क्या दिखाता हूं और सामान्य रूप से ContentProvider का उपयोग करता हूं?

1) आपका आवेदन खत्म (जैसे OnDestroy में प्रवेश()) सुनिश्चित करें कि आप SQLiteDatabase का डाटाबेस उदाहरणों और SQLiteOpenHelpers (मॉडल यदि का उपयोग करके सभी कर्सर बंद करते हैं, कर (कनेक्शन:

+2

यह पुराना धागा है लेकिन अभी भी Google पर प्रासंगिक है, इसलिए यहां सही उत्तर का संदर्भ दिया गया है: http: // stackoverflow।कॉम/प्रश्न/4547461/क्लोजिंग-द-डेटाबेस-इन-ए-कंटेंटप्रोवाइडर – saulobrito

+0

मुझे लगता है कि यह सबसे अच्छा जवाब है, धन्यवाद। – cmoaciopm

+0

इस महान स्पष्टीकरण को पढ़ें और सामग्री प्रदाता का उपयोग करते समय डीबी को बंद करने की कोई आवश्यकता नहीं है .. http://stackoverflow.com/questions/14002022/android-sq-lite-closed-exception/25379071#25379071 – Nepster

उत्तर

5

आप मामलों के एक जोड़े को कवर करने के लिए है .isOpen()) object.close())

2) जब आप आवेदन करते हैं तो रोकें() -> ऑनर्यूम() - इस चरण का उपयोग अपने कनेक्शन को रोकने/फिर से शुरू करने या उन्हें बंद/खोलने के लिए उचित रूप से करें।

इसके साथ काम करने के तुरंत बाद अपने डेटाबेस को बंद करना एक अच्छा अभ्यास है। डेटाबेस कैश किया गया है, वहाँ यह बंद करने में कोई समस्या नहीं है और पुन: प्राप्त उदाहरण फिर जब आप getWritableDatabase()/getReadableDatabase()

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

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

मैं उनके साथ काम करना बंद करने के तुरंत बाद सभी कर्सर और डेटाबेस बंद करने की अनुशंसा करता हूं। हमेशा प्रश्नों के संचालन के लिए प्रयास/पकड़/लागू करने का प्रयास करें और अंत में वस्तुओं पर बंद विधियों को कॉल करने के लिए अवरुद्ध करें।

+0

धन्यवाद hovanessyan! लेकिन मुझे क्या परेशानी है कि मेरा ऐप बहु थ्रेड का समर्थन करता है, मुझे नहीं पता कि "कब" डेटाबेस को वास्तव में ऐप द्वारा जरूरी नहीं है। दूसरी समस्या यह है कि: मैं जो सामना कर रहा हूं वह है सामग्री प्रदाता (संभवतः सामग्री रिसेल्वर सटीक होगा), परत डिजाइन बिंदु से, मुझे SQLiteDatabase या SQLiteOpenHelpers easilly का संदर्भ नहीं मिल सकता है। मुझे ContenProvider अवधारणा से नफरत है! – cmoaciopm

+0

यदि आप डीबी कॉल के लिए अलग थ्रेड का उपयोग कर रहे हैं, तो मुझे लगता है कि आप AsyncTasks का उपयोग करेंगे। यदि ऐसा है तो आप doInBackground() में सभी परिचालन करते हैं और आप ऑब्जेक्ट को पोस्ट करें PostExecute() पर। मैं दूसरी समस्या को समझ नहीं पाया। क्या आप इस परत डिजाइन बिंदु पर विस्तार कर सकते हैं>? – hovanessyan

+1

मैंने आपके सुझाव की तरह तर्क की कोशिश की है, लेकिन "डेटाबेस पहले से बंद" जैसे अपवाद मिला है। मुझे लगता है कि नीचे कोड की तरह कोड निष्पादित करें: 1। थ्रेड ए getWritableDatabase(); 2. थ्रेड बी बंद डेटाबेस; 3. धागा एक निष्पादित एसक्यूएल क्वेरी और अपवाद हुआ! – cmoaciopm

6

एंड्रॉइड फ्रेमवर्क इंजीनियर इस विचार को स्थगित करते हैं कि आपको डीबी को बंद करने की आवश्यकता है।

के रूप में डायने Hackborn (एंड्रॉयड फ्रेमवर्क इंजीनियर) प्रति in this thread:

जब इसकी होस्टिंग प्रक्रिया बनाई गई है एक सामग्री प्रदाता बन जाता है, और जब तक प्रक्रिया करता है के लिए चारों ओर बनी हुई है, इसलिए कोई जरूरत नहीं है डेटाबेस को बंद करें - प्रक्रिया को मारने पर प्रक्रिया के संसाधनों की सफाई कर्नेल के हिस्से के रूप में बंद हो जाएगी।

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