ContentObserver
とはどう違いDatasetObserver
ますか?
どちらかをいつ使用する必要がありますか?
私Cursor
は単一の行で取得します。データの変更について通知を受け取りたい - 例えば。行が更新されたとき。
どのオブザーバー クラスを登録すればよいですか?
ContentObserver
とはどう違いDatasetObserver
ますか?
どちらかをいつ使用する必要がありますか?
私Cursor
は単一の行で取得します。データの変更について通知を受け取りたい - 例えば。行が更新されたとき。
どのオブザーバー クラスを登録すればよいですか?
(またはContentProvider
経由で ) を使用してデータを取得する場合は、 を に添付するだけです。のコードは、がカーソルに関連付けられた の通知をブロードキャストするたびに呼び出されます。ContentResolver
Activity.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);
このアプローチは、オブジェクト指向設計のオブザーバー パターンの良い例です。
この質問がまだ誰かのレーダーに乗っているかどうかはわかりません。私はしばらくの間、同じ質問に苦労しています。DataSet Observer を使用するか ContentObserver を使用するかを決定するためのリトマス試験紙として思いついたのは、非常に簡単です。
通知で URI を送信する必要がある場合は、ContentObserver を使用します。1 つのオブジェクトに別のオブジェクトが変更されたことを通知する必要がある場合は、DataSetObserver を使用します。
少なくとも私にとっての区切り要因は、通知を送信しているオブジェクトが、その基になるリソース (オブジェクト、レコード、クエリ、またはカーソル) を「ユニバーサル リソース識別子」としてアプリケーションの残りの部分に公開することです。または、オブジェクトがそのデータのソースを隠していますか。
ptcの回答を補足するために、 AdapterDataSetObserver
でコンテンツの変更を処理するために使用されます。たとえば、 Adapter でリストビューを動的に更新するために使用できます。メソッドを使用して登録できます。DataSetObserver
Adapter#registerDataSetObserver()
DataSetObserver
同様の方法でCursor内のコンテンツの変化を観察するためにも使用できます。
開発した私の最後のアプリから、私は言うことができます。ContentObserver と DataSetObserver の主な違いは、ContentObserver が Observer に対して変更を行い、ContentProvider に影響を与えることです。一方、DataSetObserver オブザーバーは、データベースへの変更の影響を与えます。