2010-11-16 4 views
30

मैं कभी कभी अपने logcat उत्पादन में यह त्रुटि दिखाई देती,एंड्रॉइड कर्सर में "fillWindow()" में अमान्य कथन का क्या अर्थ है?

Cursor: invalid statement in fillWindow(). 

यह कभी कभी होता है जब मैं वापस कुंजी दबाएँ और फिर इसे अपने कस्टम listview पर जाने से पहले डिफ़ॉल्ट Android listview को जाता है।

इसका क्या अर्थ है? मैं इसे कैसे हल करूं? क्योंकि यह कोड की किसी भी पंक्ति को इंगित नहीं करता है जहां समस्या आ रही है।

+1

एक ही समस्या होने के बाद, मुझे बस यह मिला। यह इस बात से संबंधित है कि आपका डीबी गलत दायरे में कैसे चल रहा है। http://groups.google.com/group/android-developers/browse_thread/thread/8bec793c626fb405 – Emile

उत्तर

31

ListActivities से निपटने के दौरान, इस समस्या को कर्सर ऑब्जेक्ट्स, कर्सर एडाप्टर ऑब्जेक्ट्स और डेटाबेस ऑब्जेक्ट्स को ठीक से बंद नहीं किया जाता है जब गतिविधि बंद हो जाती है, और गतिविधि शुरू होने या फिर से शुरू होने पर ठीक से सेट नहीं किया जा रहा है।

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

मैं पहले ही कर्सर और डेटाबेस ऑब्जेक्ट्स बंद कर रहा था, लेकिन मेरे SimpleListAdapter कर्सर को बंद नहीं कर रहा था।

/** 
    * onStop method 
    * 
    * Perform actions when the Activity is hidden from view 
    * 
    * @return void 
    * 
    */ 
    @Override 
    protected void onStop() { 
    try { 
     super.onStop(); 

     if (this.mySimpleListAdapterObj !=null){ 
     this.mySimpleListAdapterObj.getCursor().close(); 
     this.mySimpleListAdapterObj= null; 
     } 

     if (this.mActivityListCursorObj != null) { 
     this.mActivityListCursorObj.close(); 
     } 

     if (this.myDatabaseClassObj != null) { 
     this.myDatabaseClassObj.close(); 
     } 
    } catch (Exception error) { 
     /** Error Handler Code **/ 
    }// end try/catch (Exception error) 
    }// end onStop 
+2

मैं बस आपको धन्यवाद देना चाहता था, मैंने इस समस्या पर निराश होने के लिए बहुत लंबा रास्ता बिताया और आपकी एकमात्र सलाह है जिसे मैंने पढ़ा एक निश्चित क्रम में चीजों को बंद करने के लिए कहा, जो काम किया। धन्यवाद! –

+2

हाय वहाँ। एंड्रॉइड के लिए काफी नया रूप में, मैंने अभी एक कार्यशाला में सीखा है कि "ऑनस्टॉप" को कॉल करने की गारंटी नहीं है। उन्होंने कहा, "ऑन पॉज़" में वह सामान करना बेहतर था। बस कह रहा है - अगर मैं गलत हूं तो कृपया मुझे सही करें। मैं अनुभवी लोगों से सीखने के लिए हमेशा तैयार हूं। – Fildor

+1

यदि यह समस्या (जो काफी महत्वपूर्ण प्रतीत होती है!) अच्छी तरह से प्रलेखित थे, तो यह प्रश्न नहीं आया होगा। धन्यवाद! मैं केवल यही चाहता हूं कि मैंने यह पाया * पहले * मैंने क्रोधित कोड लिखने के अनगिनत घंटे बर्बाद कर दिए। –

18

यह अत्यंत महत्वपूर्ण है कि आप सही क्रम में कर्सर, डेटाबेस, डीबीहेल्पर बंद करें।

उदा। नीचे दिए गए कोड के लिए ।

DBHelper dbhelper = new DBHelper(); 
SQLiteDataBase db = dbhelper.getWritableDatabase(); 

Cursor c = db.query(/*some parameters*/); 

बंद करने के आदेश हो की तरह करना चाहिए:

c.close(); 
db.close(); 
dbhelper.close(); 

अन्यथा विभिन्न त्रुटियों को उत्पन्न करने पर रखने के लिए और डेवलपर भी इसके बारे में पता करने के लिए नहीं आती है। "कर्सर: fillWindow() में अमान्य कथन" ऐसी त्रुटियों में से एक है।

+2

क्या होगा यदि मैं अपनी सूची गतिविधि के लिए कस्टम कर्सर एडाप्टर (कर्सर एडाप्टर को विस्तारित करता हूं) के लिए विधि से कर्सर लौटा रहा हूं, तो –

0

यदि आप कस्टम क्लास इंस्टेंस का उपयोग कर रहे हैं उदा। Model m कि एक DatabaseManager, जो बारी में धारण धारण एक SQLiteDatabase: मॉडल> ​​DatabaseManager->

SQLiteDatabase उसके बाद, आप मीटर एक प्रश्न करना (जो उचित प्रतिनिधिमंडलों करता है) और फिर आप m.close() की तरह कुछ करना (यदि जो वास्तव में SQLiteDatabase बंद करता है) और उसके बाद आप कर्सर का उपयोग करने का प्रयास करते हैं तो आपको वह त्रुटि मिल जाएगी।

समाधान है: पहले कर्सर का उपयोग करें और फिर डीबी बंद करें।

मेरी प्रतिक्रिया अब तक 2 मौजूदा में आधारित है, जिसने मुझे समस्या को हल करने के लिए प्रेरित किया।

6

हो सकता है कि यह आपकी मदद कर सकते हैं: http://www.ragtag.info/2011/feb/1/database-pitfalls/

ऐसा लगता है कि कॉल getReadableDatabase और getWritableDatabase रिटर्न डेटाबेस (भले ही आप उन्हें करने के लिए कई कॉल किए) के लिए एक ही कनेक्शन करने के लिए। तो, पर किसी भी कॉल को बंद करें() उनमें से किसी भी कनेक्शन को बंद कर देगा।

यदि आप बाद में एक कर्सर का उपयोग करने का प्रयास करते हैं, तो आपको अच्छा 'अमान्य कथन' मिलेगा, क्योंकि कर्सर जिस कनेक्शन पर निर्भर करता है, वह पहले ही बंद हो चुका है।

0

मुझे अभी भी 'fillWindow()' त्रुटि में अमान्य कथन के साथ समस्याएं हैं।

मैंने इस सूची को मेरी सूची दृश्य के लिए SimpleCursorAdapter कर्सर तक सीमित कर दिया है।

उदाहरण के लिए, यदि मैं एक गतिविधि ए के लिए सूचीदृश्य में हूं, और मैं एक नई गतिविधि बी शुरू करने से पहले कर्सर को बंद करता हूं, तो मुझे गतिविधि ए पर वापस आने पर 'fillWindow()' में अमान्य कथन नहीं मिलता है

हालांकि, गतिविधि बी लोड से पहले, मुझे गतिविधि ए की सूचीदृश्य से सूची दिखाई देती है, स्क्रीन पर गायब हो जाती है, और स्क्रीन बी छिपाने से पहले 'नो रिकॉर्ड्स मिला' संदेश संक्षिप्त रूप से प्रदर्शित होता है, गतिविधि बी की स्क्रीन दिखाए जाने से पहले।

मैं इस मुद्दे को कैसे हल कर सकता हूं?

संपादित करें: मुझे वास्तव में आज सुबह यह पता चला। मैं अपने ListActivity कक्षाओं में onPause विधि के लिए

this.stopManagingCursor(this.myListCursor);

जोड़ा, और कहा कि 'fillWindow में अमान्य बयान()' त्रुटि संकल्प लिया।

+0

से निपटने के लिए कैसे मैंने वास्तव में इसे आज सुबह बाहर निकाला। मैंने 'list.stopManagingCursor (this.myListCursor)' को मेरी सूची एक्टिविटी कक्षाओं में ऑन पॉज़ विधि में जोड़ा, और उसने 'fillWindow()' त्रुटि में अमान्य कथन का समाधान किया। – Bryan

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

  • कोई संबंधित समस्या नहीं^_^