44

Android開発ガイドによると

コンテンツプロバイダーは、アプリケーション専用で共有されていないデータの読み取りと書き込みにも役立ちます。

一般に、コンテンツプロバイダーは、さまざまなアプリケーションにデータを提供したり、アプリケーション間でデータを共有したりするために使用されます。プライベートプロバイダーを持っていて、それを共有したくないということには何か意味があるのだろうかと思いました。DBまたはファイルシステムへの直接アクセスでは提供されない利点はありますか?

ありがとう、ラジャス

4

2 に答える 2

78
  1. すべてのサーバー側と同期DBアクセスをバックグラウンドスレッドで自動的にスケジュールします。ただし、アプリケーションフロントエンドでは、コンテンツリゾルバー/プロバイダーは通常、デフォルトでUIスレッドからクエリ/トランザクションを実行します。CursorLoaderアプリケーションがUI側でスムーズに実行されるようにするには、すべてのトランザクションを非同期で(つまり、を使用して)実行する必要があります。
  2. を介してアクセスするすべてのスレッドからの再入可能なDBアクセスをローカライズするContentProviderため、すべてのロックは、DBレイヤー、サービス、およびUIレイヤーで追跡するのではなく、ContentProviderオーバーライド呼び出しで完全に発生します。
  3. 上記の一部として、データへの優れたシングルトンインターフェイスも提供します-アプリに10個のActivityクラスがある場合は、SQLiteDatabaseの開閉を処理する必要があるのではなく、それぞれからContentResolver静的呼び出しを実行するだけです。アプリ内のあるアクティビティから別のアクティビティにジャンプするときの各アクティビティ。
  4. ContentProviderは、SyncAdapterモデルと非常に緊密に連携しています。つまり、データベースをネット上でサーバーがホストするデータベースと同期させたい場合は、これがほぼ唯一の方法です。(アプリはREST apiタイプの状況を反映しています)
  5. これは、ContentResolverのContentObserverインターフェイスに関連付けられています。これは、(他の多くの便利な機能の中でも)ビューが特定のデータセットを監視するものとして登録できるインターフェイスです(カーソルを介してそのデータにアクセスします)。次に、ContentProviderに変更を加えると、CPはCRに通知でき、CRは関連するカーソルに通知できます。これにより、クエリが再実行され、ビューが更新されます。これは、ビューを手動で追跡して無効にして再描画できるようにするよりもはるかにクリーンです。

DBの再入可能ロックに関しては、完全には実行されませんが、それは役立ちます-ContentProviderクラスは4つの単純な関数(CRUDインターフェイス)を実装し、オーバーライドすることを選択した場合は、5番目のbatchAdd()- -これにより、ロックがローカライズされます。骨の折れる簡単な答えは、関数レベルで「同期された」これらの関数宣言の4つまたは5つすべてにタグを付けるだけで、完了です。5つの異なるアクティビティでDBにアクセスする20の場所からロックアウトすることを理解しようとするよりもはるかにクリーンです。

于 2011-04-08T18:37:15.357 に答える
1

たとえば、1つのアプリケーション共有データベースでプライベートContentProviderを使用する必要がある2つのプロセス間で、マルチプロセスアプリケーションの使用シナリオ(通常、音楽再生サービスはリモートプロセスで実行されます)。

于 2016-06-15T13:52:26.287 に答える