问题
I have created a small application, trying to understand the functionality of the LoaderManager and CursorLoader-classes.
I have implemented LoaderCallbacks<Cursor> on my FragmentActivity-class and everything works fine, except the fact that when I update my data via ContentResolver.update() or ContentResolver.insert()-methods, onLoadFinished() is not called and as a result my data doesn't update.
I have a custom ContentProvider and I am wondering if the problem is in my ContentProvider not notifying that the data changed or something else.
回答1:
Did you call setNotificationUri(ContentResolver cr, Uri uri) on the Cursor before returning it in ContentProvider.query()?
And did you call getContext().getContentResolver().notifyChange(uri, null) in the 'insert' method of your ContentProvider?
EDIT:
To get a ContentResolver call getContext().getContentResolver() in your ContentProvider.
回答2:
Also check if you call somewhere cursor.close(), because in this case you unregister the content observer which was registered by CursorLoader. And the cursor closing is managed by CursorLoader.
回答3:
Accepted answer was the little bit tricky to understand so I am writing the answer to make it easy for other developers..
- Go to the class in which you have extended the
ContentProvider Find the query() method which has the following syntax
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)Write this line where you are returning the cursor
cursor.setNotificationUri(getContext().getContentResolver(), uri); return cursor;
In the end, my query method looks like this
@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;
}`
来源:https://stackoverflow.com/questions/7915050/cursorloader-not-updating-after-data-change