ContentObserver
和DatasetObserver
有什么区别?
何时应该使用其中之一?
我获取了只有一行的Cursor
。我想在数据发生更改时得到通知 - 例如当行被更新时。
我应该注册哪个观察器类?
ContentObserver
和DatasetObserver
有什么区别?
何时应该使用其中之一?
我获取了只有一行的Cursor
。我想在数据发生更改时得到通知 - 例如当行被更新时。
我应该注册哪个观察器类?
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);
这种方法是面向对象设计中观察者模式的一个很好的例子。
我不确定这个问题是否仍然在任何人的关注中。我已经为同样的问题苦苦挣扎了一段时间。我想出了一个决定是使用DataSet Observer还是ContentObserver的试金石:
如果我需要在我的通知中发送URI,则使用ContentObserver。如果我只需要通知一个对象另一个对象已更改,则使用DataSetObserver。
对我来说,区分因素是发送通知的对象是否将其基础资源(无论是对象、记录、查询还是游标)公开为“通用资源标识符”以供应用程序的其余部分使用;还是该对象隐藏其数据来源。
DataSetObserver
用于处理适配器中的内容更改,例如,它可用于使用适配器动态更新listview。您可以使用Adapter#registerDataSetObserver()
方法注册一个DataSetObserver
。
DataSetObserver
也可以用类似的方式观察游标中的内容更改。从我开发的上一个应用来看,我可以说。 ContentObserver和DataSetObserver的主要区别在于,ContentObserver会观察对ContentProvider产生影响的任何更改。另一方面,DataSetObserver会观察对数据库产生影响的任何更改。
DatasetObserver
和ContentProvider
有什么不同之处? - pixelDataSetObserver
,但根据文档(http://developer.android.com/reference/android/database/DataSetObserver.html)显示,`DataSetObserver`会被通知游标的生命周期变化,例如关闭和重新查询,而`ContentObserver`用于监视底层数据的更改。希望这能帮到你。 - ptcDatasetObserver
观察Cursor
状态,而ContentProvider
观察底层内容的更改。谢谢! - pixelrequery()
现在已被弃用,做这件事的方法是否已经改变? - Andrew Wyld