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


103

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

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


2
コンテンツプロバイダーを記述しやすくするためにライブラリを作成しました。プレーンなSQLiteOpenHelperを書くよりも簡単です。github.com/coocood/VContentProvider
coocood 2012

回答:


59

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

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

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


34
私はあなたの正当化に同意しますが、コンテンツプロバイダーが実装されると、多くのメリットを得ることが重要(特に初心者にとって)だと思います。たとえば、を使用しCursorLoaderて非同期クエリを実行できます...シングルトンインスタンス(ContentResolver)にアクセスしてクエリを実行できます。もちろん、独自のローダーを実装してSQLiteデータベースに使用することもできます...もちろん、あなたはアプリケーション全体で単一のデータベースインスタンスへのアクセスを実装できます。もちろん、共有したい場合を除き、ContentProviderは必要ありません
Alex Lockwood

11
他のアプリとのデータ。とはいえ、独自のコンテンツプロバイダーを実装することには多くの利点があるため、アプリがデータを共有しないという理由だけで、それを考慮から外すべきではありません。
Alex Lockwood 2012年

8
ええ、あなたは完全に正しいですが、私はそれでもほとんどの場合努力する価値はないと思います。私は少なくとも12の異なるAndroidアプリ(Playストアに公開)を実行しており、を必要とすることはありませんContentProvider。実際、私たちが取り組んでいた最後のアプリは最初はで作成ContentProviderされましたが、実際には使用するよりもお尻のほうが面倒なので、削除しました(基本的なを実装しやすくするためにライブラリを作成しましたContentProvidergithub.com/casidiablo/persistenceですが、自分のXDを使用したことはありません)。
クリスティアン

1
@Cristianが最も実用的なアドバイスを提供します。Androidのドキュメントでさえ、必要がないContentProvider場合は使用すべきでないと述べています-「使用が完全に独自のアプリケーション内であり、必要がない場合は、データベースや他のタイプの永続ストレージを使用するプロバイダーは必要ありません。上記の機能のいずれか。代わりに、「アプリデータの保存」ページで説明されているストレージシステムのいずれかを使用できます。」それ以外の場合は、エンジニアリングが終わりました。
Cheok Yan Cheng 2018

概要:データを共有する予定がない場合は、コンテンツプロバイダーを回避できますが、コンテンツプロバイダーは、アプリのデータベースを変更したい場合に便利です。たとえば、SQLiteからMangoDBへ。
Prashant

116

ContentProviderあなたがそれを公開するつもりがなくても、それを使用することは間違いなく良い考えだと私は主張します。

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

また、将来的にデータを公開する可能性が常にあります。事前に使用しないContentProviderと、後日改造するのがはるかに難しくなります。

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

要約すると、ContentProvider(とにかく良いアイデアであるAPIを学習した後の)事前の書き込みに伴うオーバーヘッドはほとんどないため、プライベートデータの場合でもそうすることは理にかなっています。


1
私はこれ以上同意できませんでした。これにより、新しい開発者がUIと結合できないようにデータレイヤーを抽象化することが強制されます。
ガブリエル

3
Androidを学んだ直後、私はこの理由からまったく同じように考え始めました。たとえ公開されていなくても、抽象化の強化と、アーキテクチャ上の決定の実装の単一ポイントからいつでもメリットを得ることができます。ContentProvidersが大好きです。
davidcsb 2014年

1
あなたは、この属性を使用して独自のアプリケーションにコンテンツプロバイダのみが利用できるようにすることができますandroid:exported="false"
トビー1ケノービ

4
私の控えめな意見では、ContentProviderを実装する必要なく、完全に抽象化された方法でデータを処理できます。
hmartinezd 2016年

2
私は私の内部のsqliteのdb(他のアプリとの相互作用なし)のためのContentProviderソリューションを実装する私の方法にあったとして、私は上の発言を見developer.android.com/guide/topics/providers/...述べているあなたは、プロバイダを必要としませんSQLiteデータベースを完全に独自のアプリケーション内で使用する場合。
セルチュクジハン

7

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


5

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

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

したがって、これらの機能が必要なくなったとしても、将来的に必要になる可能性があるため、すぐに実装してすぐに実装できます。


すばらしい答えです。ContentProviders私たちがそれらを使用する必要がある3つの個別の理由と1つの説明。時には、簡単な説明が最適です。+1
AdamInTheOculus

4

ContentProvidersを理解するのは少し難しいと思いますが、自分のアプリで内部的に使用する場合でも、確実に役立ちます。これの最も良い点は、コンテンツプロバイダーを適切なURIに合わせてカスタマイズできることです。

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

コンテンツプロバイダーを先に進めることをお勧めします。コンテンツプロバイダーがいかに強力であるかに驚くことでしょう。


2

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

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

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


1

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

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

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

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


0

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


デフォルトでは、コンテンツプロバイダーは公開されておらず、それらへのアクセス制限の管理は簡単です。誤った情報を広めることへの反対票。
TBridges42 2016

2
@ TBridges42あなたは(悪かった)間違っています。実際、APIレベル17のコンテンツプロバイダーが公開されるまでは。そして、回答までの間に、Androidデバイスの25%がこの動作の影響を受け、コメントの時点ではまだ10%が影響を受けていました。だから、それはもっと逆の方法です:あなたが安全であることが事実である/そうでないことを述べているので、あなたのコメントは危険です。
Murmel

0

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.