在ContentProvider 的query 方法中,将侦听器附加到返回的光标:
Cursor cursor = queryBuilder.query(dbConnection, projection, selection, selectionArgs, null, null, sortOrder);
cursor.setNotificationUri(getContext().getContentResolver(), uri);
然后在您的insert/update/delete 方法中使用如下代码:
final long objectId = dbConnection.insertOrThrow(ObjectTable.TABLE_NAME, null, values);
final Uri newObjectUri = ContentUris.withAppendedId(OBJECT_CONTENT_URI, objectId );
getContext().getContentResolver().notifyChange(newObjectUri , null);
您的CursorLoader 将收到通知,OnLoadFinished(Loader, Cursor) 将再次被调用。
如果您不使用Loader,则可以使用ContentObserver,只需几行代码即可通知您数据库更改(但您需要重新查询手动)。
private ContentObserver objectObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
restartObjectLoader();
}
};
记得拨打onResume():
getContentResolver().registerContentObserver(ObjectProvider.OBJECT_CONTENT_URI, false, objectObserver);
在onPause():
getContentResolver().unregisterContentObserver(objectObserver);
更新:用户界面更改
这是一个更大的主题,因为它取决于您用来填充ListView 或RecyclerView 的Adapter。
光标适配器
在onLoadFinished(Loader loader, Cursor data)
mAdapter.swapCursor(data);
阵列适配器
在onLoadFinished(Loader loader, Cursor data)
Object[] objects = transformCursorToArray(data); //you need to write this method
mAdapter.setObjects(objects); //You need to wrie this method in your implementation on the adapter
mAdapter.notifyDataSetChange();
RecyclerView.Adapter
在onLoadFinished(Loader loader, Cursor data)
Object[] objects = transformCursorToArray(data); //you need to write this method
//Here you have more mAdapter.notify....()
阅读from here 了解通知RecyclerView.Adapter 的不同方式。