web-dev-qa-db-ja.com

コンテンツプロバイダーを使用する場合

コンテンツプロバイダーは、アプリケーション間でデータをパブリックに共有できるように作られていることを理解しています。ただし、自分のアプリ内だけで使用するコンテンツプロバイダーを作成することについて考えている人がいるかどうか疑問に思っています。これを行う利点はありますか?欠点はありますか?

過去にデータベースのデータにアクセスするためにSQliteOpenHelperを実装したばかりですが、コンテンツプロバイダーの作成を検討しています。データをリクエストするためのURIアプローチは明確で簡潔であると感じています。一方、アプリケーションにコンテンツプロバイダーを使用するだけでは冗長になり(その中にSQliteOpenHelperクラスがあるため)、必要以上の作業が必要になりますか?

98
Pzanno

データを共有する予定がない場合は、コンテンツプロバイダーについては考えないでください。それらは強力ですが、書くのが難しく、内部で使用する場合、実装するのはばかげています。

ただし、自分のアプリ内だけで使用するコンテンツプロバイダーを作成することについて考えている人がいるかどうか疑問に思っています。

もちろん...たとえば、私が書いた古いTODOリストアプリの場合、他のアプリがタスクの状態を取得してアクセスできるようにするために、コンテンツプロバイダーを作成する必要がありました。それは要件の一部でしたが、それ以上に意味があり、アプリをより良くしました。

54
Cristian

ContentProviderを使用することは、公開するつもりがなくても間違いなく良い考えだと思います。

内部での変更を容易にするために、データに抽象化の追加レベルを提供することは良い習慣です。基になるデータベース構造を後で変更することにした場合はどうなりますか? ContentProviderを使用すると、その中にすべての構造的変更を含めることができます。使用しない場合と同様に、構造的変更の影響を受けるコードのすべての領域を変更する必要があります。さらに、データベースへの低レベルのアクセスでコードを散らかすのではなく、データにアクセスするために同じ標準APIを再利用できるのは素晴らしいことです。

また、将来データを公開する可能性が常にあります。 ContentProviderを前もって使用しない場合、後日それを改良することははるかに困難になります。

次に、Androidのその他の部分があります。ContentProvidersを使用する場合やデータアクセスを含むアプリウィジェットが必要な場合など、SyncAdapter 'sが必要/推奨されます例えば。

要約すると、ContentProviderを前もって書くことに関係するオーバーヘッドはほとんどありません(とにかく良いアイデアであるAPIを学んだので)。

114
Paul Drummond

Eclipse用のMOTODEV Studioをご覧ください。 Eclipseを拡張する開発環境です。データベースのコンテンツプロバイダーを自動的に生成できるツールがあります。コンテンツプロバイダーがデータへのアクセスを容易にし、パフォーマンスに大きな影響を与えない場合は、先に進んで使用してください。ほとんどのシナリオでこれが当てはまります。

ContentProvidersを把握するのは少し難しいですが、アプリの内部で使用したい場合でも、それらは間違いなく役立ちます。それについての最もよいことは、適切なURIのコンテンツプロバイダーをカスタマイズできることです。

データベースに5つのテーブルがある場合のシナリオを次に示しますが、使用する前に特定の順序でいくつかのテーブルを結合する必要があります。そして、これらの各結合のコンテンツURIを作成します。次に、これらのURIをそれぞれテーブルとして使用できます。

コンテンツプロバイダーを使用することをお勧めします。コンテンツプロバイダーの威力に驚くことでしょう。

4
Shubhayu

要するに、Content Providersデータを効果的に管理するに役立ちます。次の理由でそれらを使用することをお勧めします。

  • Iとデータベース間の抽象化層として機能します。 ContentProvidersにdata validationを実装して、ユーザーが入力したデータを検証できます。また、UIや他の部分に触れることなく、データベースの構造を変更することができます。
  • SyncAdapterのような他のAndroidフレームワーククラスとうまく連携します。たとえば、CursorLoaderとともにContentProvidersを使用してデータベースの値が変更された場合、リストを自動的に更新できます。 ContentProviderがないと、これらのような多くの機能を独自に実装する必要があります。
  • プライベートデータを他のアプリに安全に公開する。 ContentProvidersを使用すると、他のアプリとデータを簡単かつ安全に共有できます。

そのため、これらの機能を今すぐ必要としない場合でも、将来必要になる可能性があります。すぐに実装して実装するのが良いでしょう。

4
Siva Prakash

私の見解では、コンテンツプロバイダーには、他のアプリとデータを共有するだけで、多くの利点があります。 Sync-Adapterを使用してサーバーと同期する必要がある場合は、Googleクラウドメッセージングを使用し、DBの基になるデータがローダーを使用して変更されたときにUIを自動更新し、検索を実装し、ウィジェットを使用します...コンテンツプロバイダーはあなたのためです。

コンテンツプロバイダーに添付されている上記の機能の一部を実装する必要がある場合があるため、ガイドラインに従うことをお勧めします

ところで、 コンテンツプロバイダージェネレーター を使用すると、5分未満でデータベースとCPをすばやく構築できます

2
Kigenyi Phillip

ドキュメントで述べたように: コンテンツプロバイダーの作成

使用が完全に独自のアプリケーション内であれば、SQLiteデータベースを使用するためにプロバイダーは必要ありません。

では、なぜこのオーバーヘッドをわざわざ開発するのでしょうか?より簡単で迅速な開発が必要ですか?したがって、抽象化の1つの層(SQLiteOpenHelperの子孫)で十分です。

Occam's Razor を参照してください。非常に正当な理由がない限り、エンティティを作成しないでください。

1
stoarch

コンテンツプロバイダーを使用すると、抽象化のレベルをさらに高めることができます。独自のアプリケーションに追加すると、プロジェクトの開発時間が大幅に増加します。ただし、複数のアプリケーション間でデータ、アプリケーション設定または構成を共有するために使用している場合は、コンテンツプロバイダーが選択されます。

セキュリティレベルに注意してください。コンテンツプロバイダーがSQLiteに書き込んでいる場合、SQLcipherを使用してリセット時データ(DAR)を暗号化することをお勧めします。 (コンテンツプロバイダーをいくつかのソリューションで使用し、デバッグとテストのために運用値のライブ「スナップショット」を取る機能を提供しました。)

0
Jim Row

他のアプリとデータを共有したくない場合は、コンテンツプロバイダーを使用しないでください。シンプルなsqlitedatabaseを使用して、データベース操作を実行します。他のアプリから機密情報にアクセスされる可能性があるため、コンテンツプロバイダーを使用して機密データを保存する場合は注意してください

0
user3030895