首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当数据库更改时,安卓SimpleCursorAdapter不会更新

当数据库更改时,安卓SimpleCursorAdapter不会更新
EN

Stack Overflow用户
提问于 2010-01-01 00:06:08
回答 6查看 40.1K关注 0票数 43

我有一个由数据库Cursor通过SimpleCursorAdapter支持的安卓ListActivity

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

问题是,当更新的视图离开屏幕并被回收时,当视图返回视图时,旧值会显示在视图上。当列表被重新绘制时,同样的事情也会发生(方向改变,等等)。

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

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-01-01 00:39:58

当您更改数据库中希望反映在Cursor中的数据(或Cursor填充的内容,如通过CursorAdapter生成的ListView )时,在Cursor上调用requery()

Cursor类似于ODBC客户端游标--它保存查询结果表示的所有数据。因此,仅仅因为您更改了数据库中的数据,Cursor就不会知道这些更改,除非您通过requery()刷新它。

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

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

票数 90
EN

Stack Overflow用户

发布于 2011-06-15 20:10:15

requery现在已弃用。从documentation

此方法已弃用。不要用这个。只需请求一个新游标,这样您就可以异步执行此操作,并在新游标返回时更新列表视图。

在获得新的游标之后,可以使用adapter.changeCursor(cursor)。这应该会更新视图。

票数 38
EN

Stack Overflow用户

发布于 2012-07-19 06:54:17

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

代码语言:javascript
运行
复制
getLoaderManager().restartLoader(0, null, this);

在您的活动中,在DB上更改某些内容后,重新生成新的游标。别忘了还定义了事件处理程序:

代码语言:javascript
运行
复制
@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);
}
票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1985955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档