2012-09-29 11 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

CursorAdapterが不要になるまでカーソルを閉じることはできません。私はシステムに開閉Cursorsの手間を残すためにstartManagingCursor方法に依存するために使用

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

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

:だから、onDestroy()メソッドでそれを閉じることができます。今では廃止されましたが(まだ動作しますが、使用することはお勧めしません)、LoaderManagerCursorLoaderクラスを使用し、それをシステムに残してCursorを処理してください。

9

あなたが作成したSimpleCursorAdapterが依然としてそのデータにアクセスしようとしているときに、Cursorを閉じているためにエラーが表示されます。

CursorLoaderを使用する場合は、実行する必要があります。

  1. カーソル
  2. の場合はnullを参照して、お使いのシンプルなカーソルのアダプタを作成し、あなたのクラスがLoaderManager.LoaderCallbacks<Cursor>
  3. を実装しまし実際onCreateLoaderCursorLoaderを作成
  4. 変数
  5. インスタンスとしてアダプタを参照してください onLoadFinished()
  6. onLoaderReset()adapter.swapCursor(cursor)
  7. でカーソルを入れ替え、S WAP adapter.swapCursorとしてnullカーソル(ヌル)とカーソル `

はまたのContentProviderにデータを置く終わる必要があります - それは悪くはないのです!

関連する問題