3

Vogella 有这篇关于内容提供者的博客文章和下面(底部)的片段,其中包含以下内容:

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;
}
4

2 回答 2

4

如果我可以这么大胆,一个更直接的解释:

我假设 OP 想知道为什么查询要通知侦听器。它没有。它不会立即通知侦听器,它只是进行设置,以便在与 Cursor 关联的数据发生更改时触发侦听器。侦听器附加到当前上下文的 ContentResolver;setNotificationUri 只是告诉那些听众“注意这个 URI”的一种方便的方式。

在像 CursorLoader 这样的东西中,Loader 会在其上下文中自动在 ContentResolver 上注册一个 ContentObserver,然后 Loader 在执行查询时调用 setNotificationUri。如果 Cursor 中的数据发生变化,ContentObserver 就会关闭,这会告诉 Loader 重置并执行新的查询。

于 2013-06-28T22:18:52.073 回答
0

它告诉光标要观察什么 uri,因此它知道源数据何时发生变化。当任何数据被修改时, ContentProvider通知ContentResolver更改然后ContentResolver通知所有注册的观察者。然后如果你有任何CursorLoaders注册了观察者,可以通过这个加载新数据

于 2013-06-28T21:30:29.663 回答