android cursor android-contentprovider contentobserver

android - ¿Diferencia entre ContentObserver y DatasetObserver?



cursor android-contentprovider (4)

¿Cuál es la diferencia entre ContentObserver y DatasetObserver ?

¿Cuándo se debe utilizar uno u otro?

Me sale el Cursor con una sola fila. Quiero que se me notifique sobre los cambios en los datos, por ejemplo. cuando la fila se actualiza.

¿Qué clase de observador debo registrar?


Desde mi última aplicación desarrollada puedo decir. La principal diferencia entre ContentObserver y DataSetObserver, es que ContentObserver hace que Observer cualquier cambio afecte a ContentProvider. Por otro lado, DataSetObserver Observer cualquier efecto de cambio en la base de datos.


No estoy seguro si esta pregunta todavía está en el radar de alguien. He estado luchando con la misma pregunta por un tiempo ahora. Lo que encontré como mi prueba de fuego para decidir si usar un DataSet Observer o un ContentObserver es bastante sencillo:

Si necesito enviar un URI en mi notificación, uso un ContentObserver. Si simplemente necesito notificar a un objeto que otro objeto ha cambiado, uso un DataSetObserver.

El factor delimitador, al menos para mí, es si el objeto que está enviando la notificación expone sus recursos subyacentes (ya sean objetos, registros, consultas o cursores) como "Identificadores de recursos universales" para el resto de la aplicación; o el objeto oculta la fuente de sus datos.


Para proporcionar el complemento a la respuesta de DataSetObserver , DataSetObserver se usa para manejar cambios de contenido en el Adapter , por ejemplo, puede usarse para actualizar la vista de lista dinámicamente con el Adaptador . Puede registrar un DataSetObserver usando el método Adapter#registerDataSetObserver() .

DataSetObserver también se puede usar para observar los cambios de contenido en el Cursor de una manera similar.


Si está utilizando un ContentProvider (a través de ContentResolver o Activity.managedQuery() ) para obtener sus datos, simplemente adjunte un ContentObserver a su Cursor . El código en onChange() se llamará siempre que ContentResolver emita una notificación para el Uri asociado con su 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; } }

Asegúrese de que su ContentProvider sea ​​un "buen ciudadano" y registre el Uri con el cursor después de una consulta:

cursor.setNotificationUri(getContentResolver(), uri);

También debe notificar a ContentResolver cualquier cambio en los datos subyacentes (por ejemplo, durante las operaciones de inserción, eliminación y actualización en su base de datos SQLite):

getContentResolver().notifyChange(uri, null);

Este enfoque es un buen ejemplo del patrón de observador del diseño orientado a objetos.