2013-05-26 2 views
5

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

मैं वर्तमान में FMDB (स्क्लाइट सी एपीआई के आसपास एक उद्देश्य-सी रैपर) का उपयोग कर रहा हूं, और मैं प्रत्येक क्वेरी से पहले खोल रहा हूं और बंद कर रहा हूं।

FMDatabase * db = [FMDatabase databaseWithPath:pathToMyDB]; 
[db open] 
FMResultSet * s = [db executeQuery:@"SELECT * FROM myTable"]; 
// Use FMResultSet 
[db close]; 

खोलें और बंद करें ट्रिगर fopen() और fclose() नीचे कम है, इसलिए मैं belive मैं डेटाबेस खुला रखने के द्वारा एक जबरदस्ती जीत हासिल कर सकते हैं।

हालांकि, मुझे विश्वास है कि अस्थायी वस्तुएं बढ़ जाएंगी, जिससे स्मृति समस्याएं पैदा हो सकती हैं। Closing the database अस्थायी वस्तुओं को साफ़ करता है।

  • मुझे डेटाबेस कनेक्शन कब खोलना और बंद करना चाहिए? (उदाहरण के लिए एप्लिकेशन बैकगाउंड दर्ज किया गया था?)
  • क्या मुझे कम स्मृति स्थितियों में VACUUM चलाना चाहिए?

उत्तर

1

डाटाबेस कोई ऑब्जेक्ट नहीं बनाता और/या रखता है (या कम से कम यह नहीं होना चाहिए)। सी एपीआई एसक्यूएल प्रश्नों का उपयोग करने का एक आसान तरीका है लेकिन एक बार उनको निष्पादित करने के बाद उन्हें रिहा किया जाना चाहिए।

अब, एक क्वेरी की लौटने वाली वस्तुओं के लिए, वे सिर्फ आपके FMResultSet में कॉपी किए गए हैं। एक बार जब आप इसे छोड़ देते हैं तो वे चले गए हैं।

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

ध्यान रखें कि ऐपडिलेगेट एक सिंगलटन (मुझे लगता है) है और आप वास्तविक प्रश्नों को करने के लिए अपने ऐप में कहीं से भी (AppDelegate*)[[UIApplication sharedApplication]delegate].your_db का उपयोग करके अपने डेटाबेस तक पहुंच सकते हैं।

VACUUM का उपयोग करके आप अपने ऐप को क्रैश करेंगे यदि आप स्मृति चेतावनी प्राप्त करते समय इसे कॉल करने का प्रयास करते हैं। इसके बारे में सोचें: डेटाबेस को पुनर्व्यवस्थित करने के लिए इसे स्मृति में लोड किया जाना चाहिए (या कम से कम इसका एक हिस्सा), यदि आपके पास पहले से ही स्मृति चेतावनी है ... poof ... crash।

आप परीक्षण कर सकते हैं कि आपका डेटाबेस स्मृति में वस्तुओं को रखता है या नहीं। बस 1 एस अंतराल (या एक बटन प्रेस) पर 100 प्रश्नों की तरह प्रदर्शन करें और उपकरणों में देखें जहां स्मृति बढ़ती है। आपके ऐप में (या रैपर में ही) में रिसाव हो सकती है और आप इसे डेटाबेस पर दोष देते हैं।

+0

उत्तर के लिए धन्यवाद। क्या आप 100% सुनिश्चित हैं कि डेटाबेस कोई ऑब्जेक्ट नहीं बनाता और/या रखता है? आप शायद सही हैं, लेकिन, यह प्रलेखन कहता है: "SQLITE_OK वापस करें यदि sqlite3 ऑब्जेक्ट सफलतापूर्वक नष्ट हो गया है ** और सभी संबंधित संसाधनों को हटा दिया गया है **" http://www.sqlite.org/c3ref/close.html – Robert

+0

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

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