数据库更改时,Android SimpleCursorAdapter不会更新
我有一个通过SimpleCursorAdapter由数据库Cursor支持的Android SimpleCursorAdapter 。 
单击项目时,数据库的相应行中的标志字段将被切换,列表中的视图需要更新。
问题是,更新的视图在屏幕上显示并被回收时,旧的值在视图中显示时显示在视图中。 每当thr列表重新绘制(方向更改等)时,都会发生同样的情况。
 我使用notifydatasetchanged()刷新游标适配器,但它似乎无效。 
我应该如何更新数据库,以便更新光标?
 当您更改数据库中要反映在该Cursor (或Cursor填充的事物,如通过CursorAdapter的ListView requery() ,请在Cursor上调用requery() )。 
  Cursor类似于ODBC客户端游标 – 它保存查询结果表示的所有数据。 因此,仅仅因为你改变了数据库中的数据, Cursor就不会知道这些改变,除非你通过requery()刷新它。 
更新 :这个整个问题和答案应该删除由于年老,但这显然是不可能的。 任何寻求Android解决scheme的人都应该记住,Android是一个迅速移动的目标,2009年的答案通常比新的答案更糟糕。
 目前的解决scheme是获取新的Cursor并使用CursorAdapter上的changeCursor()或swapCursor()来影响数据更改。 
  requery现已被弃用。 从文档 : 
此方法已弃用。 不要使用这个。 只需要请求一个新的游标,这样你就可以asynchronous执行这个操作,并在新的游标返回时更新你的列表视图。
 获得一个新的游标后,可以使用adapter.changeCursor(cursor) 。 这应该更新视图。 
在使用加载器和自动生成的光标的情况下,您可以调用:
 getLoaderManager().restartLoader(0, null, this); 
在你的活动中,改变数据库上的东西后,重新生成新的游标。 不要忘记还要定义事件处理程序:
 @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { CursorLoader cursorLoader = new CursorLoader(this, YOUR_URI, YOUR_PROJECTION, null, null, null); return cursorLoader; } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { adapter.swapCursor(data); } @Override public void onLoaderReset(Loader<Cursor> loader) { adapter.swapCursor(null); } 
 如果将CursorAdapter的autoRequery属性设置为true我不清楚。 
 适配器将检查autoRequery属性; 如果它是false ,那么光标不会被改变。 
requery()已经被弃用,只需在CursorAdapter的子类中实现像这样的简单的updateUI()方法,并在数据更新后调用它:
 private void updateUI(){ swapCursor(dbHelper.getCursor()); notifyDataSetChanged(); } 
这很容易。
 private Db mDbAdapter; private Cursor mCursor; private SimpleCursorAdapter mCursorAd; ..................................... //After removing the item from the DB, use this ..................................... mCursor = mDbAdapter.getAllItems(); mCursorAd.swapCursor(mCursor); 
或者使用CursorLoader …