我目前正在大量修改/重写一个Android应用程序,我看到一个非常偶然的崩溃沿着以下几行:一个CursorAdapter方法被调用,它调用AbstractWindowedCursor#checkPosition(),和:
02-20 15:03:18.180 E/AndroidRuntime(17143): android.database.StaleDataException: Attempting to access a closed CursorWindow.Most probable cause: cursor is deactivated prior to calling this method.
02-20 15:03:18.180 E/AndroidRuntime(17143): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:139)
02-20 15:03:18.180 E/AndroidRuntime(17143): at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:74)
02-20 15:03:18.180 E/AndroidRuntime(17143): at android.database.CursorWrapper.getLong(CursorWrapper.java:106)
02-20 15:03:18.180 E/AndroidRuntime(17143): at android.widget.CursorAdapter.getItemId(CursorAdapter.java:220)
Run Code Online (Sandbox Code Playgroud)
麻烦的是,我们没有关闭任何Cursors.我们所有的Cursors都来自CursorLoaders而且又是由a产生的ContentProvider.我们要传递Cursor到每个相应的CursorAdapter从LoaderCallbacks,我们正在注册Cursor中的通知ContentProvider,我们通知了ContentResolver从各insert(...),delete(...)和update(...)......总之我找不到任何理由为什么Cursor会在使用中关闭一段时间.
那么:a 的其他原因是 …
android staledataexception android-contentprovider android-loadermanager android-loader
我试图显示一个带有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,
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) { …Run Code Online (Sandbox Code Playgroud) 有人可以向我解释一下 StaleDataException
07-11 19:58:23.298 E/AndroidRuntime( 1044): Uncaught handler: thread main exiting due to uncaught exception
07-11 19:58:23.368 E/AndroidRuntime( 1044): android.database.StaleDataException: Access closed cursor
07-11 19:58:23.368 E/AndroidRuntime( 1044): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:217)
07-11 19:58:23.368 E/AndroidRuntime( 1044): at android.database.AbstractWindowedCursor.getInt(AbstractWindowedCursor.java:84)
07-11 19:58:23.368 E/AndroidRuntime( 1044): at android.database.CursorWrapper.getInt(CursorWrapper.java:128)
Run Code Online (Sandbox Code Playgroud)
我们何时以及如何确保对游标进行查询,以及为什么在此异常时失败?