问题
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