【发布时间】:2011-07-22 19:10:04
【问题描述】:
ContentObserver 和 DatasetObserver 有什么区别?
什么时候应该使用一个或另一个?
我得到Cursor 单行。我想收到有关数据更改的通知 - 例如。当行更新时。
我应该注册哪个观察者类?
【问题讨论】:
标签: android android-contentprovider android-cursor contentobserver
ContentObserver 和 DatasetObserver 有什么区别?
什么时候应该使用一个或另一个?
我得到Cursor 单行。我想收到有关数据更改的通知 - 例如。当行更新时。
我应该注册哪个观察者类?
【问题讨论】:
标签: android android-contentprovider android-cursor contentobserver
如果您使用ContentProvider(通过ContentResolver 或Activity.managedQuery())获取数据,只需将ContentObserver 附加到您的Cursor。每当ContentResolver 广播与您的光标关联的Uri 的通知时,就会调用onChange() 中的代码。
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);
这种方法是面向对象设计的观察者模式的一个很好的例子。
【讨论】:
DatasetObserver 与 ContentProvider 有何不同?
DataSetObserver,但从文档 (developer.android.com/reference/android/database/…) 看来,DataSetObserver 会通知游标生命周期更改,例如关闭和重新查询,而 ContentObserver 是用于观察基础数据的变化。希望对您有所帮助。
DatasetObserver 观察Cursor 状态,而ContentProvider 观察底层内容变化。谢谢!
requery() 现已弃用,是否更改了执行此操作的方法?
我可以说,从我开发的上一个应用程序开始。 ContentObserver 和 DataSetObserver 之间的主要区别在于,ContentObserver 对 Observer 进行任何影响 ContentProvider 的更改。另一方面,DataSetObserver 观察任何变化对数据库的影响。
【讨论】:
为了补充 ptc 的回答,DataSetObserver 用于处理Adapter 中的内容变化,例如可以用于updating listview dynamically with Adapter。您可以使用Adapter#registerDataSetObserver() 方法注册DataSetObserver。
DataSetObserver也可以用类似的方式观察Cursor中的内容变化。
【讨论】:
我不确定这个问题是否仍然引起人们的注意。我一直在为同样的问题苦苦挣扎一段时间。作为决定是使用 DataSet Observer 还是 ContentObserver 的试金石,我想出的方法非常简单:
如果我需要在通知中发送 URI,我会使用 ContentObserver。如果我只需要通知一个对象另一个对象发生了变化——我使用 DataSetObserver。
至少对我而言,分隔因素是发送通知的对象是否将其底层资源(无论是对象、记录、查询或游标)作为“通用资源标识符”暴露给应用程序的其余部分;或者对象是否隐藏了其数据的来源。
【讨论】: