ContentObserver和DatasetObserver之间的区别?

时间:2011-03-25 09:52:06

标签: android cursor android-contentprovider contentobserver

ContentObserverDatasetObserver之间有什么区别?

什么时候应该使用?

我得到Cursor单行。我希望收到有关数据更改的通知 - 例如。当行更新时。

我应该注册哪个观察员课程?

4 个答案:

答案 0 :(得分:29)

如果您使用ContentProvider(通过ContentResolverActivity.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对数据库有任何改变的影响。