ContentProvidersとContentResolverの違いは何ですか? SQLite
データベースは必要ありません。メディア用のアプリケーションを開発しています。
説明が見つかりました こちら 。要約すれば
Content Resolverは、URIを特定のContent providerに解決します。
Content Providerは、コンテンツを照会するためのインターフェースを提供します。
コンテンツプロバイダーを照会する方法はcontentResolverInstance.query(URI,.....)
です
ContentProviders
は、データベースを他の部分から抽象化するために使用され、データベースとUI /他のクラス間のインターフェースとして機能します。アプリデータを他のアプリと共有するには、独自のContentProviderを作成する必要があります。
ContentResolver
は、ContentUris
に基づいて適切なContentProviderを選択するために使用されます。 ContentUriは次のようになります
content://com.Android.contacts/contacts/3
注:独自のアプリはこのルートを使用してデータを処理することもできます。
詳細については、 Androidのコンテンツプロバイダー を参照してください
ContentResolver-> ContentProvider-> SQLiteDatabase
主な違いは、他の回答で述べたようにこれです
ContentProviderは、アプリケーションのプライベートデータを外部アプリケーションに公開します
while
ContentResolverは、URIを使用してすべてのContentProviderの中で適切なContentProviderを提供します。
回り道しましょう。
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 も表示できますが、十分に文書化されていません。
絶対に遅れる。実用的な説明が見つかりました。それを実証する
銀行からお金を引き出したいとします。次の手順を実行する必要があります
ABC Bankのキャッシャー(コンテンツリゾルバー)-> ABC Bank Gateway(コンテンツプロバイダー)-> Bank Server(データベース)。
上記のキャッシャーは、銀行ゲートウェイの実装も銀行データベースについても知らない
同様に、コンテンツリゾルバーはコンテンツプロバイダーにクエリを実行し、ContentProviderはSQLiteデータベースに格納されているデータをデータベースの実装に通知せずに他のアプリケーションに公開します。