13

मुझे पता है कि इस सवाल ने SO में कई बार पूछा है, लेकिन मैं अपनी सटीक समस्या का पता नहीं लगा सका।पहले से बंद ऑब्जेक्ट को फिर से खोलने का प्रयास: java.lang.IleglegalStateException :?

मैं डेटाबेस से डेटा प्राप्त करने के लिए निम्न कोड का उपयोग कर रहा हूं (तालिका 1) और पुनर्प्राप्ति मूल्य के आधार पर एक और तालिका 2 अपडेट करें। कुछ एंड्रॉइड संस्करणों में यह ठीक काम कर रहा है, लेकिन जब मैं एंड्रॉइड 4.0.3 के साथ परीक्षण करने गया। मुझे यह java.lang.IllegalStateException:?.attempt to re-open an already-closed objectsum_cursor.moveToNext(); पर मिल रहा है।

मैं इस कोड का उपयोग AsyncTask में कर रहा हूं।

/** Sum of total matched values*/ 
      Cursor sum_cursor = db.gettotalMatchvalue(this); 
      if(sum_cursor!=null) 
      { 
       sum_cursor.moveToFirst(); 
       for(int j=0; j<sum_cursor.getCount();j++) 
       {  
        float totalmatchedscore = sum_cursor.getInt(0); 
        float totalingredients = Float.parseFloat(sum_cursor.getString(sum_cursor.getColumnIndex(APPDatabase.CK_TOTALINCREDIENTS))); 
        /**average = totalscore/totalingredients*/ 
        double average = totalmatchedscore/totalingredients; 
        int id = Integer.parseInt(sum_cursor.getString(sum_cursor.getColumnIndex(APPDatabase.CK_ID))); 

       db.updateAverage(id, average); 
       sum_cursor.moveToNext(); //Here is the problem 
       } 
      } 
      db.close(); 

मेरे अद्यतन विधि

/** Update average */ 
public void updateAverage(int id,double average) 
{ 
    SQLiteDatabase db = getWritableDatabase(); 
    ContentValues values = new ContentValues(); 
    values.put(CK_FINALVALUE,average); 
    db.update(TABLE, values,CK_ID+" = "+id , null); 
} 

कोडिंग क्या मैं गलत यहाँ कर रहा हूँ?

मुझे पता है कि आप में से कई इस स्थिति में आते हैं। क्या आप मेरी मदद कर सकते हैं।

आपकी मदद के लिए धन्यवाद।

+0

शायद तुम बंद कर दिया है async कार्य के बाहर डेटाबेस। क्या आपने इसके लिए जांच की है? –

+0

वह सिस्टम है जो 4.0.3 आपके द्वारा उपयोग की जा रही अन्य प्रणालियों की तुलना में किसी भी तेजी से चल रहा है, यदि ऐसा है तो आप कुछ दौड़ की स्थिति हो सकती हैं। –

+0

नहीं, मुझे लगता है कि ठीक है .. – GoCrazy

उत्तर

23

आप किसी क्वेरी के परिणामों पर पुनरावृत्ति करते समय एक तालिका अपडेट नहीं कर सकते हैं। इस के लिए अच्छे कारण हैं; क्या होगा यदि आप जो डेटा जोड़ रहे हैं, उस डेटा में बदलाव आएगा जिस पर आप पुन: प्रयास कर रहे हैं? आपका कर्सर वैध डेटा वापस नहीं करेगा।

updateAverage() में तालिका में डेटा को वापस स्टोर करने का प्रयास समस्या पैदा कर रहा है। आपको बस अपने लूप के दौरान औसत मान याद रखना चाहिए, और फिर अपने कर्सर पर लूपिंग समाप्त करने के बाद इसे एक बार अंत में अपडेट करना चाहिए।

आपको जो सटीक त्रुटि मिल रही है उसे और समझाने के लिए: नए डेटा डालने का कार्य डेटाबेस को उन सभी कर्सर को बंद करने का कारण बन रहा है जो वर्तमान में खुले हैं, सुरक्षा उपाय के रूप में। इसलिए जब आप औसत अपडेट करने के बाद sum_cursor.moveToNext() पर कॉल करते हैं, तो कर्सर यह जानकर आश्चर्यचकित होता है कि यह पहले ही बंद हो चुका है।

+0

आपकी शानदार जानकारी के लिए धन्यवाद .. आपकी जानकारी से मुझे जो मिला है वह स्टोर है सरणी या सूची में औसत मान और फिर इसे किसी अन्य लूप में अपडेट करें .. क्या मैं सही – GoCrazy

+0

हां, ऐसा कुछ। –

+0

धन्यवाद मैं इसे आज़माउंगा और आपको बता दूंगा .. और – GoCrazy

2

यदि आप db.updateAverage(id, average) पर टिप्पणी करते हैं तो क्या होगा?

+0

आपके उत्तर के लिए धन्यवाद .. वास्तव में 'डीबी .updateAverage (आईडी, औसत) 'बहुत महत्वपूर्ण है .. इस अद्यतन के आधार पर मैं केवल अगले चरण – GoCrazy

+0

पर जा रहा हूं @ विनोथ मेरा मतलब है, अगर आप इसे टिप्पणी करते हैं तो त्रुटि दूर हो जाती है? –

+0

क्षमा करें एलेक्स मैं अब परीक्षण नहीं कर सका क्योंकि वह फोन मेरे दोस्त थे .. मैं केवल कल का परीक्षण कर सकता हूं और आपको बता सकता हूं .. यह वास्तव में वायर्ड – GoCrazy

0

आप शुद्ध एसक्यूएल के साथ अपने लक्ष्य को प्राप्त कर सकते हैं यह तेजी से और देखें की वास्तुकला की दृष्टि से बेहतर

REPLACE INTO table_where_to_put SELECT *, (totalmatchedscore/totalingredients) as average FROM table_with_input_data 

उपयोग REPLACE या UPDATE है क्योंकि सभी तर्क एक एसक्यूएल लेनदेन में किया जाएगा