为什么在内容提供程序查询方法中通知侦听器?

时间:2013-06-28 21:25:15

标签: android android-contentprovider

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

2 个答案:

答案 0 :(得分:4)

如果我可能如此大胆,那就是一个更直接的解释:

我认为OP想知道查询为什么要通知侦听器。它没有。它不是立即通知听众,它只是设置,以便在与Cursor关联的数据发生更改时将触发侦听器。监听器附加到当前Context的ContentResolver; setNotificationUri只是告诉那些听众“看这个URI。”的方便方法。

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

答案 1 :(得分:0)

它告诉光标要观看什么uri,因此它知道它的源数据何时发生变化。修改任何数据后,ContentProvider会通知ContentResolver有关更改的信息,然后ContentResolver会通知所有已注册的观察者。然后,如果您有任何已注册观察者的CursorLoaders,则可以通过此

加载新数据