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.