ContentObserver和DatasetObserver之间的区别是什么?

31

ContentObserverDatasetObserver有什么区别?

何时应该使用其中之一?

我获取了只有一行的Cursor。我想在数据发生更改时得到通知 - 例如当行被更新时。

我应该注册哪个观察器类?

4个回答

30
如果您正在使用ContentResolverActivity.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);

这种方法是面向对象设计中观察者模式的一个很好的例子。


12
好的,DatasetObserverContentProvider 有什么不同之处? - pixel
14
我从未使用过DataSetObserver,但根据文档(http://developer.android.com/reference/android/database/DataSetObserver.html)显示,`DataSetObserver`会被通知游标的生命周期变化,例如关闭和重新查询,而`ContentObserver`用于监视底层数据的更改。希望这能帮到你。 - ptc
7
现在我明白了。DatasetObserver 观察 Cursor 状态,而 ContentProvider 观察底层内容的更改。谢谢! - pixel
1
requery()现在已被弃用,做这件事的方法是否已经改变? - Andrew Wyld
1
使用managedQuery也已经被弃用,目前推荐的方法是使用CursorLoaders异步查询ContentProvider。它们会观察变化并自动重新查询游标。请参见:https://dev59.com/k2w05IYBdhLWcg3wiyRJ。 - ptc

6

我不确定这个问题是否仍然在任何人的关注中。我已经为同样的问题苦苦挣扎了一段时间。我想出了一个决定是使用DataSet Observer还是ContentObserver的试金石:

如果我需要在我的通知中发送URI,则使用ContentObserver。如果我只需要通知一个对象另一个对象已更改,则使用DataSetObserver。

对我来说,区分因素是发送通知的对象是否将其基础资源(无论是对象、记录、查询还是游标)公开为“通用资源标识符”以供应用程序的其余部分使用;还是该对象隐藏其数据来源。


2
为了补充ptc的答案,DataSetObserver用于处理适配器中的内容更改,例如,它可用于使用适配器动态更新listview。您可以使用Adapter#registerDataSetObserver()方法注册一个DataSetObserverDataSetObserver也可以用类似的方式观察游标中的内容更改。

1

从我开发的上一个应用来看,我可以说。 ContentObserver和DataSetObserver的主要区别在于,ContentObserver会观察对ContentProvider产生影响的任何更改。另一方面,DataSetObserver会观察对数据库产生影响的任何更改。


2
DatasetObserver可以与BaseAdapter注册,而BaseAdapter不仅限于数据库。 - IgorGanapolsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接