2012-09-29 13 views
7

के साथ StaleDataException मैं अपने डेटाबेस से नामों के साथ एक सूचीदृश्य के साथ एक संवाद दिखाने की कोशिश कर रहा हूं लेकिन मुझे StaleDataException मिल रहा है। मैं जानता हूँ कि आम तौर पर मतलब है कि मैं एक बंद कर्सर से डेटा का उपयोग कोशिश कर रहा हूँ, लेकिन अभी मैं समझता हूँ कि मैं ऐसा क्योंडायलॉग

d = new Dialog(this); 
d.setContentView(R.layout.dialog_layout); 
d.setTitle("Select Bowler"); 

ListView lv = (ListView)d.findViewById(R.id.dialog_list); 
Cursor c = getContentResolver().query(
    BowlersDB.CONTENT_URI, 
    new String[] { 
     BowlersDB.ID, BowlersDB.FIRST_NAME, BowlersDB.LAST_NAME 
    }, 
    null, 
    null, 
    BowlersDB.LAST_NAME + " COLLATE LOCALIZED ASC" 
); 

if (c.moveToFirst() && c != null) { 
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(
     this, 
     R.layout.names_listview, 
     c, 
     new String[] { 
      BowlersDB.FIRST_NAME, BowlersDB.LAST_NAME 
     }, 
     new int[] { 
      R.id.bListTextView, R.id.bListTextView2 
     }, 
     0 
    ); 
    lv.setAdapter(adapter); 
    lv.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> arg0, View v, int position, long id) { 
      bowlerClickedID = id; 
      updateName(id); 
     } 
    }); 
    d.show(); 
} 
c.close(); 

त्रुटि

android.database.StaleDataException: 
    Attempting to access a closed CursorWindow. 
    Most probable cause: cursor is deactivated prior to calling this method. 

    at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:139) 
    at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50) 
    at android.database.CursorWrapper.getString(CursorWrapper.java:114) 
    at android.widget.SimpleCursorAdapter.bindView(SimpleCursorAdapter.java:150) 
    at android.widget.CursorAdapter.getView(CursorAdapter.java:250) 
    at android.widget.AbsListView.obtainView(AbsListView.java:2267) 
    at android.widget.ListView.measureHeightOfChildren(ListView.java:1244) 
    at android.widget.ListView.onMeasure(ListView.java:1156) 
    at android.view.View.measure(View.java:15172) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814) 
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1390) 
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:681) 
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:574) 
    at android.view.View.measure(View.java:15172) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
    at android.view.View.measure(View.java:15172) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
    at android.view.View.measure(View.java:15172) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814) 
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1390) 
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:681) 
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:574) 
    at android.view.View.measure(View.java:15172) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
    at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2148) 
    at android.view.View.measure(View.java:15172) 
    ... 
हो रही है न जब तक मैं सभी डेटा प्राप्त कर्सर बंद नहीं करता है

संपादित करें: यदि मैं c.close() लाइन पर टिप्पणी करता हूं तो यह ठीक काम करता है लेकिन मैं सिर्फ कर्सर को खोल नहीं सकता हूं, तो मैं क्या करूँ?

उत्तर

4

आप कर्सर को तब तक बंद नहीं कर सकते जब तक कि कर्सर एडाप्टर की आवश्यकता नहीं होती है। तो तुम OnDestroy में इसे बंद कर सकते हैं() विधि:

@Override 
public void onDestroy() { 
super.onDestroy(); 

ListView lv = (ListView) d.findViewById(R.id.dialog_list); 
((CursorAdapter) lv.getAdapter()).getCursor().close(); 
database.close(); 
} 
0

मैं startManagingCursor पद्धति पर भरोसा करने के लिए खोलने और व्यवस्था करने के लिए Cursors बंद करने की परेशानी को छोड़ने के लिए इस्तेमाल किया। अब जब इसे बहिष्कृत किया गया है (यह अभी भी काम करता है लेकिन मैं इसका उपयोग करने की अनुशंसा नहीं करता), CursorLoader कक्षा LoaderManager के साथ कक्षा का उपयोग करने पर विचार करें और इसे कर्सर बंद करने के लिए सिस्टम पर छोड़ दें।

9

आपको अपनी त्रुटि मिल रही है क्योंकि आप Cursor बंद कर रहे हैं जबकि SimpleCursorAdapter आप अभी भी डेटा एक्सेस करने का प्रयास कर रहे हैं।

यदि आप CursorLoader का उपयोग करना चाहते हैं, जैसा कि आपको करना चाहिए।

  1. एक उदाहरण चर
  2. कर्सर के लिए अशक्त के लिए एक संदर्भ के साथ अपने सरल कर्सर एडाप्टर बनाएं रूप में अपने एडाप्टर के लिए एक संदर्भ रखें
  3. अपने वर्ग को लागू है LoaderManager.LoaderCallbacks<Cursor>
  4. असल onCreateLoader में CursorLoader बनाने
  5. onLoadFinished() में, adapter.swapCursor(cursor)
  6. साथ कर्सर स्वैप onLoaderReset() में, एस adapter.swapCursor के रूप में एक null कर्सर (शून्य) `

तुम भी एक ContentProvider में अपना डेटा डालना पहुंचना चाहिए साथ कर्सर वैप - यह है कि बुरा नहीं है!

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