31

ContentObserverとはどう違いDatasetObserverますか?

どちらかをいつ使用する必要がありますか?

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

どのオブザーバー クラスを登録すればよいですか?

4

4 に答える 4

29

(またはContentProvider経由で ) を使用してデータを取得する場合は、 を に添付するだけです。のコードは、がカーソルに関連付けられた の通知をブロードキャストするたびに呼び出されます。ContentResolverActivity.managedQuery()ContentObserverCursoronChange()ContentResolverUri

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);

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

于 2011-04-13T03:43:51.493 に答える
6

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

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

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

于 2016-07-27T12:34:57.560 に答える
2

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

DataSetObserver同様の方法でCursor内のコンテンツの変化を観察するためにも使用できます。

于 2016-04-03T15:55:10.587 に答える
1

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

于 2013-07-16T23:58:15.940 に答える