私はアプリケーションに関連するすべてのデータの挿入と取得を処理するContentProviderを持っています。私はGoogle I/OのVirgil Dobjanschiによって提案されたパターンに従っています。私は最初のパターンを使用しています。AndroidのContentProviderでテーブルを結合してContentObserverに通知するためのベストプラクティス
私の問題は、データベース内の複数のテーブルによって表される論理エンティティがあることです。
たとえば、記事テーブルとArticleExtrasテーブルがあります。 Articleは記事自体を表し、ArticleExtrasはコメントの数などの特定の記事に関する追加情報を表します。
UIでCursorAdapterを使用して、記事タイトルとその記事のコメント数をListViewの1行に表示しました。
これを実装するために、記事テーブルのContentProviderクエリメソッドにleft outer join ArticleExtras on
ステートメントを追加しました。これは、CursorAdapterがArticleExtrasをアーティクル自体と共に取得するためです。
新しい記事がWebからフェッチされると、ContentProviderを介してデータベースに挿入され、CursorAdapterが通知され、UIを更新すると、この部分は期待どおりに機能しました。
しかし、私はコメント(ArticleExtras)の数を取得したときに、List3の行を更新できるように、content://com.myapp.content/Articles
の変更を監視している同じCursorAdapterも通知します。
私の現在の実装は次のとおりです:ArticleExtrasをデータベースに挿入した後、記事テーブルに挿入したばかりのArticleExtrasに関連する行があるかどうかを確認する新しいクエリを開始します。もしそうなら、私はその記事の新しいURIを作成し(例えば、content://com.myapp.cotent/Articles/123
)、getContext().getContentResolver().notifyChange(uri, null)
と呼ぶので、この記事の変更を監視している対応するCursorAdapterが通知を受けるでしょう。
アプローチは正しいですか、それとも私が望むものを実装するためのより良い方法がありますか?