微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android – 带对话框的StaleDataException

我试图显示一个带有listview的对话框,其中包含我的数据库中的名称,但我不断收到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,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()行,它工作正常,但我不能将光标打开,所以我该怎么办?

解决方法

在不再需要CursorAdapter之前,无法关闭光标.所以你可以在onDestroy()方法关闭它:
@Override
public void onDestroy() {
 super.onDestroy();

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

原文地址:https://www.jb51.cc/android/316628.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐