web-dev-qa-db-ja.com

ContentObserverとDatasetObserverの違いは?

ContentObserverDatasetObserverの違いは何ですか?

いつ使用する必要がありますか?

単一行でCursorを取得します。データの変更について通知を受けたい-例:行が更新されたとき。

どのオブザーバークラスを登録する必要がありますか?

31
pixel

ContentProviderContentResolverまたはActivity.managedQuery()経由)を使用してデータを取得している場合は、ContentObserverCursorに添付するだけです。 。 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);

このアプローチは、オブジェクト指向設計のオブザーバーパターンの良い例です。

29
ptc

この質問がまだ誰かのレーダーにあるかどうかはわかりません。私はしばらくの間、同じ質問に苦しんでいます。 DataSet ObserverとContentObserverのどちらを使用するかを決定するためのリトマステストとして私が思いついたのは、非常に簡単です。

通知でURIを送信する必要がある場合は、ContentObserverを使用します。あるオブジェクトに別のオブジェクトが変更されたことを通知する必要があるだけの場合は、DataSetObserverを使用します。

少なくとも私にとっての区切り要因は、通知を送信しているオブジェクトが、その基になるリソース(オブジェクト、レコード、クエリ、カーソルなど)を「UniversalResourceIdentifiers」としてアプリケーションの残りの部分に公開することです。または、オブジェクトはそのデータのソースを非表示にしますか。

5
Charles Thomas

Ptcの回答を補足するために、DataSetObserverAdapter のコンテンツ変更を処理するために使用されます。たとえば、 Adapterを使用してリストビューを動的に更新する に使用できます。 =。 Adapter#registerDataSetObserver()メソッドを使用してDataSetObserverを登録できます。

DataSetObserverを使用して、同様の方法で カーソル のコンテンツの変更を監視することもできます。

2

私が開発した最後のアプリから、私は言うことができます。 ContentObserverとDataSetObserverの主な違いは、ContentObserverがContentProviderに影響を与える変更をObserverに加えることです。一方、DataSetObserverObserverはデータベースへの変更の影響を監視します。

1
devqmr