12

私は android ドメインに不慣れで、学習段階にあります。私はいくつかのクエリを受け取りました:

アプリごとに 1 つの ContentResolver オブジェクトがありますか? シングルトンオブジェクトですか?このオブジェクトのライフサイクルを管理するのは誰ですか? シングルトンの場合、ContentProvider を照会する複数のリクエストをどのように処理しますか?

4

1 に答える 1

22

Alex Lockwood のブログから - http://www.androiddesignpatterns.com/2012/06/content-resolvers-and-content-providers.html

コンテンツ リゾルバーとは何ですか?

Content Resolver は、アプリケーション内の単一のグローバル インスタンスであり、(および他のアプリケーションの) コンテンツ プロバイダーへのアクセスを提供します。コンテンツ リゾルバーは、その名前が示すとおりに動作します。クライアントからの要求を受け入れ、それらの要求を明確な権限を持つコンテンツ プロバイダーに転送することで、これらの要求を解決します。これを行うために、コンテンツ リゾルバーは、権限からコンテンツ プロバイダーへのマッピングを保存します。この設計は、他のアプリケーションのコンテンツ プロバイダに簡単かつ安全にアクセスできるため、重要です。

Content Resolver には、Content Provider クラスの抽象メソッド (insert、delete、query、update) に対応する CRUD (create、read、update、delete) メソッドが含まれています。コンテンツ リゾルバーは、対話しているコンテンツ プロバイダーの実装を認識していません (また、認識する必要もありません)。各メソッドには、対話するコンテンツ プロバイダーを指定する URI が渡されます。

コンテンツ プロバイダーとは何ですか?

コンテンツ リゾルバーがアプリケーションのコンテンツ プロバイダーからの抽象化を提供するのに対し、コンテンツ プロバイダーは、基礎となるデータ ソース (つまり、SQLite データベース) からの抽象化を提供します。それらは、データ セキュリティを定義するためのメカニズムを提供し (つまり、読み取り/書き込み許可を適用することにより)、あるプロセスのデータを別のプロセスで実行されているコードに接続する標準インターフェイスを提供します。

コンテンツ プロバイダーは、content:// スキーマを使用した単純な URI アドレッシング モデルに基づいて、データを公開および使用するためのインターフェイスを提供します。アプリケーション レイヤーを基になるデータ レイヤーから切り離し、基になるデータ ソースを抽象化することで、アプリケーションのデータ ソースに依存しないようにすることができます。

クエリの寿命

それでは、単純なクエリの背後にある段階的なプロセスとは正確には何なのでしょうか? 前述のように、コンテンツ プロバイダーを介してデータベースからデータをクエリする場合、プロバイダーと直接通信することはありません。代わりに、Content Resolver オブジェクトを使用してプロバイダーと通信します。クエリが作成されたときに発生する特定のイベント シーケンスを以下に示します。

  • への呼び出しgetContentResolver().query(Uri, String, String, String, String)が行われます。この呼び出しは、
    ではなく、コンテンツ リゾルバーのクエリ メソッドを呼び出しますContentProvider's

  • メソッドが呼び出されると、queryContent Resolver はuri 引数を解析し、その権限を抽出します。

  • コンテンツ リゾルバーは、(一意の) 機関に登録されたコンテンツ プロバイダーに要求を送信します。
    これは、コンテンツ プロバイダのqueryメソッドを呼び出すことによって行われます。

  • メソッドが呼び出されると、Content Provider's queryクエリが実行され、カーソルが返されます (または例外がスローされます)。結果の動作は、コンテンツ プロバイダの 実装
    に完全に依存します。

于 2014-01-10T11:09:40.173 に答える