CursorLoader not updating after data change
Solution 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
.
Solution 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.
Solution 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;
}`