数据更改后 CursorLoader 不更新
Posted
技术标签:
【中文标题】数据更改后 CursorLoader 不更新【英文标题】:CursorLoader not updating after data change 【发布时间】:2011-12-16 10:26:03 【问题描述】:我创建了一个小应用程序,试图了解LoaderManager
和CursorLoader
-classes 的功能。
我已经在我的FragmentActivity
-class 上实现了LoaderCallbacks<Cursor>
,一切正常,除了当我通过ContentResolver.update()
或ContentResolver.insert()
-方法更新我的数据时,onLoadFinished()
没有被调用并且作为结果我的数据没有更新。
我有一个自定义的 ContentProvider,我想知道问题是否在于我的 ContentProvider 没有通知数据已更改或其他原因。
【问题讨论】:
您是否在更新/插入 ContentProvider 方法实现中调用getContext().getContentResolver().notifyChange(Uri,..);
?在从 ContentProvider 中的查询方法返回之前,您是否调用了 cursor.setNotificationUri(getContext().getContentResolver(), uri);
不,我没有,这就是问题所在!谢谢! :)
【参考方案1】:
在ContentProvider.query()
中返回之前,您是否在Cursor
上致电setNotificationUri(ContentResolver cr, Uri uri)
?
您是否在ContentProvider
的“插入”方法中调用了getContext().getContentResolver().notifyChange(uri, null)
?
编辑:
要在您的ContentProvider
中获得ContentResolver
呼叫getContext().getContentResolver()
。
【讨论】:
在我关注android dev docs 创建内容提供者时没有提到这一点很烦人 另外,您不应该在 onLoadFinished 的任何时候调用 cursor.close() ,否则您将不会收到对基础数据集的任何进一步更新。 传递给 setNotificationUri() 的 URI 是否与 notifyChange() URI 完全匹配,或者只是必须具有相同的权限或其他什么? URI 必须相等。 @Herrmann 还有什么其他人应该注意的。即:我用相同的URI调用 setNotificationUri(ContentResolver cr, Uri uri) 和 notifyChange(uri, null) 。但是我的列表视图没有更新。【参考方案2】:还要检查你是否在某个地方调用了 cursor.close(),因为在这种情况下,你取消注册了由 CursorLoader 注册的内容观察者。并且游标的关闭由 CursorLoader 管理。
【讨论】:
这是我的实现中缺少的链接【参考方案3】:接受的答案有点难以理解,所以我写下答案是为了方便其他开发人员..
-
转到您扩展
ContentProvider
的课程
找到具有以下语法的 query() 方法
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
在返回光标的地方写下这一行
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
最后我的查询方法是这样的
@Nullable
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
Cursor cursor;
cursor = noticeDbHelper.getReadableDatabase().query(
NoticeContract.NoticeTable.TABLE_NAME,
projection,
selection,
selectionArgs,
null,
null,
sortOrder
);
//This line will let CursorLoader know about any data change on "uri" , So that data will be reloaded to CursorLoader
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
`
【讨论】:
以上是关于数据更改后 CursorLoader 不更新的主要内容,如果未能解决你的问题,请参考以下文章
即使应用程序处于非活动状态,CursorLoader 如何自动更新视图?
自定义 CursorLoader 和支持 ListView 的 CursorAdapter 之间的数据不同步
如何在 ViewPager 中使用 cursorLoader?