androidandroid-contentproviderandroid-cursorcontentobserver

Difference between ContentObserver and DatasetObserver?


What is difference between ContentObserver and DatasetObserver?

When one or another should be used?

I get Cursor with single row. I want to be notified about data changes - eg. when row is updated.

Which observer class should I register?


Solution

  • If you are using a ContentProvider (via ContentResolver or Activity.managedQuery()) to get your data, simply attach a ContentObserver to your Cursor. The code in onChange() will be called whenever the ContentResolver broadcasts a notification for the Uri associated with your cursor.

    Cursor myCursor = managedQuery(myUri, projection, where, whereArgs, sortBy);
    myCursor.registerContentObserver(new ContentObserver() {
        @Override
        public void onChange(boolean selfChange) {
            // This cursor's Uri has been notified of a change
            // Call cursor.requery() or run managedQuery() again
        }
    
        @Override
        public boolean deliverSelfNotifications() {
            return true;
        }
    }
    

    Make sure your ContentProvider is a "good citizen" and registers the Uri with the cursor after a query:

    cursor.setNotificationUri(getContentResolver(), uri);
    

    It should also notify the ContentResolver of any changes to the underlying data (for instance, during insert, delete, and update operations on your SQLite database):

    getContentResolver().notifyChange(uri, null);
    

    This approach is a good example of the Observer Pattern of object-oriented design.