2011-09-29 16 views
6

में SQLite डेटाबेस कर्सर के बारे में कुछ सवाल अपने आवेदन मैं पीछा किया Lars Vogel tutorial में डेटाबेस का उपयोग लागू करने के लिए, लेकिन मैं बहुत चीजों की एक जोड़ी के बारे में उलझन हूँ ...एंड्रॉयड

1) हर बार जब एक फोन है fetchTodo पर बनाया गया एक नया कर्सर बनाया और वापस कर दिया जाएगा। कचरा कलेक्टर के लिए पिछले कर्सर छोड़ना। इसलिए, अगर मैं उस मामले के लिए startManagingCursor या CursorLoader का उपयोग नहीं करता, तो क्या मुझे कर्सर पर .close() कॉल करना चाहिए जब मैं इसके साथ करूँ?

Cursor cursor = mNotesAdapter.fetchTodo(); 
// do something... 
cursor.close(); 

मैं इस कर्सर पूरा कर लेने और नया लाने के लिए अगले पर बनाया जाएगा, मैं तो इस तरह यह बंद हो जाना चाहिए या मैं इसे कचरा कलेक्टर के लिए छोड़ देना चाहिए: निश्चित रूप से fetchTodo गुंजाइश है, उदाहरण के के बाहर ? हालांकि मुझे लगता है कि मैं लगभग 2 चीजों के बारे में पूरी तरह से अलग बात कर रहा हूं ... प्वाइंट होने के नाते, क्या मुझे इसे उपर्युक्त उदाहरण में बंद करना चाहिए या नहीं?

2)Cursor भी एक .deactivate() विधि है और प्रलेखन यह कम संसाधनों का उपयोग करता (सक्रिय कर्सर से) कहते हैं। मुझे इसका उपयोग कब करना चाहिए? उदाहरण के लिए, मेरे ऐप में, मेरे पास ListActivity है जो SimpleCursorAdapter के माध्यम से पॉप्युलेट किया गया है (इसके लिए कोड प्रारंभिक केवल एक बार कहा जाता है)। इस्तेमाल किया जाने वाला कर्सर एक वर्ग सदस्य चर है, क्योंकि मुझे उस विधि के बाहर इसकी आवश्यकता है जो सूची को पॉप्युलेट करता है। जब डेटाबेस से कुछ हटा दिया जाता है तो मुझे डेटाबेस की आवश्यकता होती है। लेकिन जब तक कोई रिकॉर्ड हटा नहीं जाता है, जो उपयोगकर्ता क्रिया है और इसमें कुछ समय लग सकता है, तो क्या मुझे कर्सर को इस दौरान निष्क्रिय करना चाहिए? क्योंकि जब मैं .requery() को दोबारा कॉल करता हूं तो यह फिर से सक्रिय होगा। या SimpleCursorAdapter काम करना बंद कर रहा है क्योंकि कर्सर सक्रिय नहीं है?

संपादित करें: मैंने अभी इसका परीक्षण किया और पाया कि मैं कर्सर एडाप्टर सेट अप करने के बाद deactivate() पर कॉल नहीं कर सकता। यदि कर्सर सक्रिय नहीं है, तो सूची खाली होगी, इसलिए जब तक ListActivity प्रदर्शित होती है तब तक इसे सक्रिय रहने की आवश्यकता होती है। अंत में, हमें StartManagingCursor इसे तब संभालना चाहिए। या नया CursorLoader

3) मुझे पता है कि startManagingCursor/stopManagingCursor पदावनत कर रहे हैं, लेकिन मैं जा रहा है लक्षित कर रहा हूँ नहीं हनीकोम्ब (कम से कम समय के लिए) और मैं अब के लिए नए CursorLoader से निपटने के लिए नहीं करना चाहती। लेकिन उपरोक्त ट्यूटोरियल में, startManagingCursor हर जगह प्रयोग किया जाता है, लेकिन stopManagingCursor कभी कभी नहीं कहा जाता है। क्यों नहीं? क्या एंड्रॉइड इसके साथ अपने तरीके से संबंधित है? किसी भी स्थिति को मुझे stopManagingCursor पर कॉल करना चाहिए?

उत्तर

9

संपादित करें:

1) हर बार जब एक फोन एक नया कर्सर बनाया जाएगा fetchTodo करने के लिए बनाया और दिया जाता है: अपडेट जवाब अद्यतित प्रश्न 1 प्रतिबिंबित करने के लिए। कचरा कलेक्टर के लिए पिछले कर्सर छोड़ना। तो, अगर मैं के लिए startManagingCursor या CursorLoader का भी उपयोग नहीं करता, तो क्या मुझे के साथ कर्सर पर एक .close() कॉल करना चाहिए?

हाँ, आप निश्चित रूप से या तो एंड्रॉयड startManagingCursor() नहीं कहेंगे, LoaderManager/CursorLoader या close() यह अपने आप का उपयोग करना चाहिए। ऐसा नहीं करने से स्मृति को रिसाव कर दिया जाएगा, जीसी उसमें मदद नहीं करेगा क्योंकि Cursor (जैसे फ़ाइल डेटाबेस में हैंडल) के पीछे मूल संसाधन हैं।

2) कर्सर में एक .deactive() विधि भी है और प्रलेखन का कहना है कि यह कम संसाधनों (सक्रिय कर्सर से) का उपयोग करता है। मुझे वास्तव में का उपयोग कब करना चाहिए? ...

संपादित अन्य पाठकों के लिए: ओ पी एक जवाब मिल गया है और यह अपने प्रश्न में पोस्ट किया। निम्नलिखित अभी भी रखती है:

मैं उपयोग नहीं किया है deactivate() (कोई deactive()), शायद किसी और इस व्याख्या कर सकते हैं। यदि आप वास्तव में दर्द रहित आवश्यकता/अपडेट चाहते हैं, तो LoaderManager ढांचे को देखें - यह केवल हनीकॉम के लिए नहीं है: कंपैट लाइब्रेरी का उपयोग करके आप LoaderManager (और Fragments) का उपयोग एंड्रॉइड 1.6 पर कर सकते हैं। न केवल आपके लिए लिखने के लिए यह कम कोड है, बल्कि यह इन चीजों को एंड्रॉइड पर पूरी तरह से ऑफ़लोड करता है, startManagingCursor() से कहीं अधिक है।

EDIT2: LoaderManager

पर कुछ नोट developer.android.com पर LoaderManager ट्यूटोरियल रहे हैं लेकिन इन काफी ... जटिल और वहाँ ट्यूटोरियल की सबसे अधिक पसंद पहली बार समझने के लिए मुश्किल है। मुझे भी बहुत कुछ खोना पड़ा, मुझे अब तक का सबसे अच्छा ऑल-इन-वन स्टॉप http://mobile.tutsplus.com/tutorials/android/android-sdk_loading-data_cursorloader/ (साथ ही सभी जावाडॉक्स और कंपैट लिब स्रोत जो आप पा सकते हैं) --- जिस तरह से LoaderManager काम बहुत समान है (अब भी DialogFragment द्वारा प्रतिस्थापित, उनके onCreateDialog, onPrepareDialog विधियों के साथ प्रबंधित संवाद जहां आप केवल "संवाद # 123" दिखाने के लिए एंड्रॉइड को बताते हैं और फिर एंड्रॉइड उस कोड के साथ आपका कोड कॉल करता है; लोडर के लिए वही: "लोड लोडर # 123", एंड्रॉइड onCreateLoader() पर कॉल करता है।

शुरुआत में केवल एक ही स्पष्ट कमी है, LoaderManagerContentProvider ढांचे पर भारी निर्भर करता है और कुछ लोग वास्तव में इसे नापसंद करते हैं। बेशक, यह अतिरिक्त सीखने और कोड है, लेकिन एक बार आपके पास अपने डेटा के लिए ContentProvider है (भले ही केवल आपके ऐप में निजी रूप से उपयोग किया जाए), सभी डेटा-टू-व्यू बाइंडिंग CursorLoader के साथ एक हवा है। IMHO, वहाँ अपने खुद के "सामग्री प्रदाता" रोलिंग और वास्तव में ContentProvider को लागू करने में थोड़ा ही अन्तर है - लेकिन यह सिर्फ मेरी राय बेहद विवादास्पद :)

3) मुझे पता है कि startManagingCursor/stopManagingCursor पदावनत कर रहे हैं लेकिन मैं है मैं हनीकॉम (कम से कम समय के लिए) को लक्षित नहीं कर रहा हूं और मैं अब नए कर्सर लोडर से निपटना नहीं चाहता हूं। लेकिन ऊपर ट्यूटोरियल में, प्रारंभ करेंमेनिंग कर्सर हर जगह प्रयोग किया जाता है, लेकिन stopManagingCursor को कभी भी कभी नहीं कहा जाता है। क्यों नहीं? क्या एंड्रॉइड से अपने तरीके से संबंधित है? किसी भी स्थिति को मुझे रोकना चाहिए कर्सरिंग कर्सर?

एक बार जब आप startManagingCursor() फोन Cursor अब वह आपके समस्या है। एंड्रॉइड कर्सर को बंद करने का ख्याल रखेगा जब आपका Activity नष्ट हो जाएगा (उपयोगकर्ता नेविगेट्स, ओरिएंटेशन चेंज, ...) नेविगेट किया है। पर कॉल करने के लिए stopManagingCursor() पर कॉल के साथ कॉल करने की कोई आवश्यकता नहीं है - आप आमतौर पर इसे छुटकारा पाने के बाद Cursor प्रबंधित करने का बोझ नहीं लेना चाहते हैं।

+0

# 1 मैंने उस प्रश्न पर अपने विचारों का पूरी तरह से गलत व्याख्या की, मुझे इसे फिर से लिखना होगा ... # 2 हां, मेरा मतलब था 'निष्क्रिय करें' (टाइपो)। मुझे 'लोडर प्रबंधक' का उपयोग करने के तरीके पर वास्तव में कोई अच्छा दस्तावेज नहीं मिल रहा है, यहां तक ​​कि यहां SO प्रश्नों में भी नहीं।# 3 मैं बिंदु को समझता हूं, लेकिन अगर मुझे 'stopManagingCursor' का उपयोग नहीं करना है, तो मैंने 'startManagingCursor'' पर कॉल किया है, तो यह विधि पहले स्थान पर क्यों मौजूद है? –

+0

मैं सिर्फ पूरे प्रश्न # 1 @ फिलिप को फिर से लिखता हूं, यदि आप एक नज़र डाल सकते हैं ... –

+0

इसके अलावा, बस # 2 का जवाब मिला; सवाल जवाब के साथ एक बार फिर से संपादित किया। –