Vogella有关于内容提供商的blog post以及下面(在底部)使用此行的代码段:
cursor.setNotificationUri(getContext().getContentResolver(), uri);
我很好奇为什么人们想要通知侦听器有关查询操作的信息。
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
// Using SQLiteQueryBuilder instead of query() method
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
// Check if the caller has requested a column which does not exists
checkColumns(projection);
// Set the table
queryBuilder.setTables(TodoTable.TABLE_TODO);
int uriType = sURIMatcher.match(uri);
switch (uriType) {
case TODOS:
break;
case TODO_ID:
// Adding the ID to the original query
queryBuilder.appendWhere(TodoTable.COLUMN_ID + "=" + uri.getLastPathSegment());
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
SQLiteDatabase db = database.getWritableDatabase();
Cursor cursor = queryBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder);
// Make sure that potential listeners are getting notified
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
}
答案 0 :(得分:4)
如果我可能如此大胆,那就是一个更直接的解释:
我认为OP想知道查询为什么要通知侦听器。它没有。它不是立即通知听众,它只是设置,以便在与Cursor关联的数据发生更改时将触发侦听器。监听器附加到当前Context的ContentResolver; setNotificationUri只是告诉那些听众“看这个URI。”的方便方法。
在像CursorLoader这样的东西中,Loader会在其上下文中自动在ContentResolver上注册ContentObserver,然后Loader在进行查询时调用setNotificationUri。如果Cursor中的数据发生更改,ContentObserver将关闭,这会告诉Loader重置并执行新查询。
答案 1 :(得分:0)
它告诉光标要观看什么uri,因此它知道它的源数据何时发生变化。修改任何数据后,ContentProvider
会通知ContentResolver
有关更改的信息,然后ContentResolver
会通知所有已注册的观察者。然后,如果您有任何已注册观察者的CursorLoaders
,则可以通过此