数据更改后CursorLoader不更新
我创build了一个小应用程序,试图了解LoaderManager
和CursorLoader
类的function。
我已经在我的FragmentActivity
类上实现了LoaderCallbacks<Cursor>
,并且一切正常,除了当我通过ContentResolver.update()
或ContentResolver.insert()
方法更新数据时, onLoadFinished()
不会被调用,并且作为结果我的数据不会更新。
我有一个自定义ContentProvider,我想知道如果问题是在我的ContentProvider不通知数据改变或其他。
您在ContentProvider.query()
返回之前是否在Cursor
上调用了setNotificationUri(ContentResolver cr, Uri uri)
ContentProvider.query()
?
你是否在ContentProvider
的'insert'方法中调用了getContext().getContentResolver().notifyChange(uri, null)
?
编辑:
在ContentProvider
调用getContext().getContentResolver()
来调用ContentResolver
。
还要检查你是否调用cursor.close(),因为在这种情况下,你注销了由CursorLoader注册的内容观察者。 游标closures由CursorLoaderpipe理。
接受的答案是有点棘手的理解,所以我正在写答案,以方便其他开发人员..
- 转到您已经扩展了
ContentProvider
-
find具有以下语法的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; }`