web-dev-qa-db-ja.com

androidのcontentproviderとcontentResolverの違いは何ですか?

ContentProvidersContentResolverの違いは何ですか? SQLiteデータベースは必要ありません。メディア用のアプリケーションを開発しています。

38
Akshay Mukadam

説明が見つかりました こちら 。要約すれば

Content Resolverは、URIを特定のContent providerに解決します。

Content Providerは、コンテンツを照会するためのインターフェースを提供します。

コンテンツプロバイダーを照会する方法はcontentResolverInstance.query(URI,.....)です

49
user1700184

ContentProvidersは、データベースを他の部分から抽象化するために使用され、データベースとUI /他のクラス間のインターフェースとして機能します。アプリデータを他のアプリと共有するには、独自のContentProviderを作成する必要があります

ContentResolverは、ContentUrisに基づいて適切なContentProviderを選択するために使用されます。 ContentUriは次のようになります

content://com.Android.contacts/contacts/3

  • content://schemeと呼ばれ、ContentUriであることを示します。
  • com.Android.contactsContent Authorityと呼ばれ、ContentResolverはそれを使用して一意のプロバイダー(この場合、ContactProvider)。
  • contactsは、プロバイダーのデータの一部のサブセット(テーブル名など)を識別するpathです。
  • 3は、データのサブセット内の行を一意に識別するために使用されるidです。

enter image description here

注:独自のアプリはこのルートを使用してデータを処理することもできます。

詳細については、 Androidのコンテンツプロバイダー を参照してください

31
Siva Prakash

2層の抽象化:

ContentResolver-> ContentProvider-> SQLiteDatabase

主な違いは、他の回答で述べたようにこれです

ContentProviderは、アプリケーションのプライベートデータを外部アプリケーションに公開します
while
ContentResolverは、URIを使用してすべてのContentProviderの中で適切なContentProviderを提供します。

(2層抽象化の)より深い理解

回り道しましょう。
SQLiteデータベースを作成するとき、データベースはアプリケーションに対してプライベートのままであるため、他の外部アプリケーションとアプリデータを共有することはできません。

データはどのように共有されますか?

ContentProviderとContentResolverは_Android.content_パッケージの一部です。これら2つのクラスは連携して、アプリケーション間で堅牢で安全なデータ共有モデルを提供します。
ContentProviderは、SQLiteデータベースに格納されているデータを、データベースの基本的な実装を通知せずに他のアプリケーションに公開します。
したがって、SQliteDatabaseを抽象化します。 しかし、キャッチがあるのを待ってください!!!
外部アプリケーションはContentProviderに直接アクセスできません。そのためには、まずContentResolverと呼ばれる別のクラスと対話する必要があります。ContentProviderファインダーとしてContentResolverを考えてください。インスタンスは1つだけで、デバイスのすべてのContentProvidersは単純な名前空間URIで登録されます。特定のContentProviderにアクセスしたい場合は、そのURIを知る必要があります。 ContentResolverに渡すと、URIを使用してプロバイダーが検索されます。
次に、最も重要なメソッドを見てみましょうgetContentResolver().query(URI,String[] proj.....)

getContentResolver().query(URI,String[] proj.....)が呼び出されるとどうなりますか

query()メソッドはContentResolverクラスに属しますが、解決されたContentProviderのabstract query()メソッドを呼び出し、Cursorオブジェクトを返します。
このようにして、外部アプリケーションは2つの抽象化レイヤーを介してプライベートデータベースに公開されます。

ポイントを追加するだけです
独自のContentResolverクラスは作成できませんが、独自のContentProviderクラスはいつでも作成できます

あなたがより良い理解を持っていることを願っています
SQLitedatabase、ContentProviderなどを作成するためのサンプルコード here も表示できますが、十分に文書化されていません。

9
Rohit Singh

絶対に遅れる。実用的な説明が見つかりました。それを実証する

銀行からお金を引き出したいとします。次の手順を実行する必要があります

ABC Bankのキャッシャー(コンテンツリゾルバー)-> ABC Bank Gateway(コンテンツプロバイダー)-> Bank Server(データベース)。

上記のキャッシャーは、銀行ゲートウェイの実装も銀行データベースについても知らない

同様に、コンテンツリゾルバーはコンテンツプロバイダーにクエリを実行し、ContentProviderはSQLiteデータベースに格納されているデータをデータベースの実装に通知せずに他のアプリケーションに公開します。

0
Tarun