【问题标题】:Difference between ContentObserver and DatasetObserver?ContentObserver 和 DatasetObserver 的区别?
【发布时间】:2011-07-22 19:10:04
【问题描述】:

ContentObserverDatasetObserver 有什么区别?

什么时候应该使用一个或另一个?

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

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

【问题讨论】:

    标签: android android-contentprovider android-cursor contentobserver


    【解决方案1】:

    如果您使用ContentProvider(通过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);
    

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

    【讨论】:

    • 好的,DatasetObserverContentProvider 有何不同?
    • 我没有使用过DataSetObserver,但从文档 (developer.android.com/reference/android/database/…) 看来,DataSetObserver 会通知游标生命周期更改,例如关闭和重新查询,而 ContentObserver 是用于观察基础数据的变化。希望对您有所帮助。
    • 现在我明白了。 DatasetObserver 观察Cursor 状态,而ContentProvider 观察底层内容变化。谢谢!
    • requery() 现已弃用,是否更改了执行此操作的方法?
    • 使用 managedQuery 也被弃用了。当前推荐的方法是使用 CursorLoaders 异步查询您的 ContentProvider。他们观察变化并自动重新查询他们的游标。看到这个:stackoverflow.com/questions/7182920/…
    【解决方案2】:

    我可以说,从我开发的上一个应用程序开始。 ContentObserver 和 DataSetObserver 之间的主要区别在于,ContentObserver 对 Observer 进行任何影响 ContentProvider 的更改。另一方面,DataSetObserver 观察任何变化对数据库的影响。

    【讨论】:

    • DatasetObserver 可以注册到 BaseAdapter - 不仅限于数据库。
    【解决方案3】:

    为了补充 ptc 的回答,DataSetObserver 用于处理Adapter 中的内容变化,例如可以用于updating listview dynamically with Adapter。您可以使用Adapter#registerDataSetObserver() 方法注册DataSetObserver

    DataSetObserver也可以用类似的方式观察Cursor中的内容变化。

    【讨论】:

      【解决方案4】:

      我不确定这个问题是否仍然引起人们的注意。我一直在为同样的问题苦苦挣扎一段时间。作为决定是使用 DataSet Observer 还是 ContentObserver 的试金石,我想出的方法非常简单:

      如果我需要在通知中发送 URI,我会使用 ContentObserver。如果我只需要通知一个对象另一个对象发生了变化——我使用 DataSetObserver。

      至少对我而言,分隔因素是发送通知的对象是否将其底层资源(无论是对象、记录、查询或游标)作为“通用资源标识符”暴露给应用程序的其余部分;或者对象是否隐藏了其数据的来源。

      【讨论】:

        猜你喜欢
        • 2012-11-28
        • 1970-01-01
        • 2012-11-09
        • 2014-02-18
        • 2013-08-07
        • 2011-10-20
        • 2020-01-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多