数据库更改时,Android SimpleCursorAdapter不会更新

时间:2009-12-31 16:06:08

标签: database android sqlite cursor listactivity

我有一个Android ListActivity,它由数据库Cursor通过SimpleCursorAdapter支持。

单击项目时,将切换数据库中相应行中的标志字段,并且需要更新列表中的视图。

问题是,当更新的视图离开屏幕并被回收时,旧视图返回到视图时会显示在视图上。每当thr list重绘时(方向更改等),都会发生同样的事情。

我使用notifydatasetchanged()刷新游标适配器,但似乎无效。

我应该如何更新数据库以便更新游标?

6 个答案:

答案 0 :(得分:90)

当您更改数据库中要反映在requery()中的数据(或Cursor填充的内容时,请Cursor上的Cursor调用ListView,例如{{1}通过CursorAdapter)。

Cursor类似于ODBC客户端游标 - 它包含查询结果表示的所有数据。因此,仅仅因为您更改了数据库中的数据,除非您通过Cursor刷新,否则requery()将无法了解这些更改。


更新:由于年龄的原因,应删除整个问题和一组答案,但这显然是不可能的。任何寻求Android答案的人都应该记住,Android是一个快速移动的目标,而2009年的答案通常比新答案更糟糕。

目前的解决方案是获取新的Cursor并使用changeCursor()上的swapCursor()CursorAdapter来影响数据更改。

答案 1 :(得分:38)

requery现已弃用。来自documentation

  

不推荐使用此方法。   不要使用它。只需请求一个新光标,这样就可以异步执行此操作,并在新光标返回后更新列表视图。

获取新游标后,可以使用adapter.changeCursor(cursor)。这应该更新视图。

答案 2 :(得分:21)

如果使用加载程序和自动生成的游标,您可以调用:

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);
}

答案 3 :(得分:1)

我不清楚你是否将CursorAdapter的autoRequery属性设置为true

适配器将检查autoRequery属性;如果是false,那么光标将不会被更改。

答案 4 :(得分:0)

requery()已被弃用,只需在CursorAdapter的子类中实现这样的简单updateUI()方法,并在数据更新后调用它:

private void updateUI(){
    swapCursor(dbHelper.getCursor());
    notifyDataSetChanged();
}

答案 5 :(得分:0)

这很容易。

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 ...