2013-06-28 22 views
3

Vegeolla有這個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; 
} 

回答

4

新的數據。如果我可以大膽,更明瞭的解釋:

我假設OP是想知道爲什麼一個查詢希望通知聽衆。它沒有。它不會立即通知監聽者,它只是設置,以便與光標相關聯的數據更改時,偵聽器將被觸發。 Listeners被附加到當前上下文的ContentResolver; setNotificationUri只是告訴那些聽衆的一種方便的方式:「觀看這個URI」。

在類似CursorLoader的情況下,Loader自動將ContentObserver註冊到ContentResolver的上下文中,然後Loader在執行查詢時調用setNotificationUri。如果Cursor中的數據發生更改,則ContentObserver會關閉,這會告知Loader重置並執行新的查詢。

0

它告訴遊標要看什麼uri,所以它知道它的源數據何時發生變化。當任何數據被修改時,ContentProvider通知ContentResolver有關更改,然後ContentResolver通知所有註冊觀察員。然後,如果有一個已註冊的觀察者任何CursorLoaders,可以加載這個

+0

我認爲它告訴觀察者不要看光標。 – CopsOnRoad

相關問題