ContentObserver
和DatasetObserver
之间有什么区别?
什么时候应该使用?
我得到Cursor
单行。我希望收到有关数据更改的通知 - 例如。当行更新时。
我应该注册哪个观察员课程?
答案 0 :(得分:29)
如果您使用ContentProvider
(通过ContentResolver
或Activity.managedQuery()
)获取数据,只需将ContentObserver
附加到Cursor
即可。只要onChange()
广播与您的光标相关联的ContentResolver
的通知,就会调用Uri
中的代码。
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;
}
}
确保您的ContentProvider
是“好公民”并在查询后使用光标注册Uri
:
cursor.setNotificationUri(getContentResolver(), uri);
它还应该通知ContentResolver
对基础数据的任何更改(例如,在SQLite数据库上的插入,删除和更新操作期间):
getContentResolver().notifyChange(uri, null);
这种方法是面向对象设计的观察者模式的一个很好的例子。
答案 1 :(得分:5)
我不确定这个问题是否还在任何人的眼中。我现在一直在努力解决同样的问题。我想出的决定是否使用DataSet Observer或ContentObserver的试金石是非常简单的:
如果我需要在通知中发送URI,我使用ContentObserver。如果我只需要通知一个对象另一个对象已经改变 - 我使用DataSetObserver。
至少对我来说,分隔因素是发送通知的对象是否将其底层资源(对象,记录,查询或游标)作为“通用资源标识符”暴露给应用程序的其余部分;或者该对象是否隐藏其数据来源。
答案 2 :(得分:2)
为了提供ptc答案的补充,DataSetObserver
用于处理Adapter中的内容更改,例如,它可用于updating listview dynamically with Adapter。您可以使用DataSetObserver
方法注册Adapter#registerDataSetObserver()
。
DataSetObserver
也可用于以类似的方式观察Cursor中的内容更改。
答案 3 :(得分:1)
从我开发的最后一个应用程序中我可以说。 ContentObserver和DataSetObserver之间的主要区别在于ContentObserver使Observer的任何更改都会影响ContentProvider。另一方面,DataSetObserver Observer对数据库有任何改变的影响。