web-dev-qa-db-ja.com

「コンテンツプロバイダー」と「SQLiteデータベース」の正確な違い

私はAndroid用のSQLiteデータベースプログラミングを行いましたが、これ以外のContent-Providerについては何も知りません:「私が言及したように Android Developer page 、Android SDKはデータの保存と取得に使用される「コンテンツプロバイダー」。

しかしその後、

  1. 「Content-Provider」と「SQLite Database」の正確な違いは何ですか?
  2. いつデータを保存するのが最適ですか?

任意の例または役立ちます!!

84
Paresh Mayani

次のように、1つの大きな違いが見つかりました。

データをデータベースに保存することは、データを永続化する良い方法の1つですが、Androidで作成されたAndroidデータベースには注意事項がありますvisibleそれらを作成したアプリケーションのみ。つまり、あるアプリケーションによってAndroidで作成されたSQLiteデータベースは、そのアプリケーションのみが使用でき、他のアプリケーションは使用できません。

そのため、need to share data between applications, you need to use the content provider model as recommended in Android.この記事では、コンテンツプロバイダーの基本と、それを実装する方法について説明します。

この記事を見つけました リンク

本当に素敵な情報が提供されます。

132
Paresh Mayani

「Content-Provider」と「SQLite Database」の正確な違いは何ですか?

ContentProviderはファサードです。データベースを他のプロセスに公開するために実装できるAPIです。 canは、データがSQLiteデータベースに格納される方法で実装されますが、そうである必要はありません。

いつデータを保存するのが最適ですか?

要約で答えることは不可能です。一般的に、何かがContentProviderの使用を要求しない限り、データベースを使用します。

53
CommonsWare

SQLiteメソッドを単純に使用する何千人ものユーザーを使って、多くの優れたアプリを作成しました。しかし、それは少し前のことであり、ContentProviderで簡単に処理できるように、大量のコードを手動で記述する必要がありました。当時は、コンテンツプロバイダーを使用することに賛成しませんでした。コードが複雑になるだけだからです。

ただし、過去数年間、Androidが進化したため、時間を節約し、さらに多くのことができるようになりましたので、ContentProviderに移行しました。現在、広範囲に使用しています。 ContentProviderを使用すると、カーソルローダー、ローダーコールバック、および一括挿入を非常に簡単に処理できますが、過去にすべてを手動で記述する必要がありましたが、それでも効率的に機能しませんでした。これは、1つのnotifychange()メソッドのおかげで自動的に更新されるようになったため、リストビューやアダプターのコンテンツを手動で更新したり、自分のリスナーを入力したりする必要がなくなりました。データベースの開閉やメモリリークの心配、それはすべてコンテンツプロバイダーが処理します。たまに直面する唯一の問題は、ContentProvidersで複雑なクエリを実行できないことです。昔ながらのsqliteとの手動操作。

以前に独自のDbAdapter、Helper、およびObserverを作成したことがある場合、すべてをContentProviderに変換するための時間を費やすことなく、それらを新しいアプリに安全に持ち越すことができます。しかし、私の経験に基づいて、ContentProviderに移行することを強くお勧めします。それに慣れるには少し時間がかかりますが、一度経験を積めば、そのままです。

PDATE 2017私はRealmに切り替えました。プラットフォーム。学習に数時間費やし、アプリ開発のキャリアで数え切れないほどの時間を節約してください。

23
zeeshan

1.コンテンツプロバイダーはスレッドセーフではありません

デフォルトでは、コンテンツプロバイダーはスレッドセーフではありません。コンテンツプロバイダーを使用して複数のスレッドを使用している場合、スローされているさまざまな例外やその他のデータの不整合を確認できます。これを修正する最も簡単な方法は、コンテンツプロバイダーによって公開される各パブリックメソッドでsynchronizedキーワードを使用することです。

この方法では、一度に1つのスレッドのみがこれらのメソッドにアクセスできます。

2.大量の書き込みを行うときにNiceを再生する

新しいServal Mapsアプリケーションでは、バイナリファイルからアプリケーションが内部で使用するデータベースにデータをインポートする必要があります。これを実行し、アプリケーションの残りの部分でニースをプレイするには、次のことが最適です。

新しいスレッドを作成してインポートを実行し、他のスレッド、特にUIの更新を担当するスレッドが悪影響を受けないようにします。各インポートの最後で一時停止して、同期メソッドを使用する必要がある他のスレッドにチャンスを与えます。

3.コンテンツプロバイダーは、時々横向きに考えるように強制します

Android=そのコンテンツプロバイダーは、データベース以外の場所からデータにアクセスできます。

つまり、基になるデータベースで生のSQLクエリを実行することはできず、クエリメソッドなどのさまざまなメソッドに渡される変数を使用して、SQLクエリのさまざまなコンポーネントを指定する必要があります。コンテンツプロバイダーによるSQLの処理方法に適合しないタスクがある場合、2つのオプションがあります。

クエリについて横方向に考えてみてください。必要なデータを取得するには、別のクエリを使用し、カーソルから結果にアクセスしてください。通常のデータへのアクセスにはURIを使用し、代替のないタスクの特定のクエリに一致する特別なURIを使用します。

8
chanu

コンテンツプロバイダーは、アプリケーション間でデータを共有する場合に使用されます。

データベースがアプリケーションに接続されており、別のアプリケーションでデータを使用する場合、データを公開するコンテンツプロバイダーを実装できます。

5
Mina Samy

高度なコンテンツ管理システムを考えてください。各オブジェクト(ページ、画像、ニュース記事、イベントアイテムなど)には、コンテンツ、アドレス、ユーザーのアクセス許可、およびシステムのさまざまな部分から操作する方法があります。コンテンツプロバイダーはAndroid向けにこれを行います。これで、アプリケーションに保存したファイルまたは画像を共有できます。また、ビジネス連絡先、編集可能なメモなどのカスタム共有可能オブジェクトを作成することもできます。また、他のアプリケーションからオブジェクトを開くときに、そのようなオブジェクトを処理するセキュリティとデフォルトアプリケーションを指定します。

3
Roberto

私は この答え を読んで、同じ疑問を探しているので、共有することを考えました。状態-

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

したがって、コンテンツプロバイダーを使用することをお勧めします。

3
Darpan

主な違いは、アプリが別のアプリと情報を共有する必要がある場合、Content-Providerを使用することです。 SQLiteを作成するアプリのストレージデータのみ

3

1つの違いは、コンテンツプロバイダーがコンテンツオブザーバーのプラットフォームをサポートしていることです。 SQLiteデータベースに独自のObservableパターンを実装する必要があります。

LoaderManagerで自動的に再クエリする方法

SQLiteのContentObserver?

1
user1538028