7

Android での SQLite データベース処理の下位互換性、複雑さ、およびベスト プラクティスを最適化するのに苦労しています。SQLite データベースとカーソルを管理する非推奨ではない方法を 2 つ見つけました。

  • 直接通してandroid.database.sqlite
  • ContentProviderCursorLoaderおよびLoaderManager

私は、データベース実装の将来の証明を設計しようとしています。これは、Google が推奨するベスト プラクティスを実装したいと考えていることを意味します。との実装に関するチュートリアルを見つけましたContentProviderLoaderManager

Lars Vogels の提案に従うと、私のコードは重複と不必要な複雑さで吹き飛ばされてしまいます。私のデータベースのいくつかのテーブルでは意味があります。ただし、これを 3 つのフィールドを持つマッピング テーブルに実装しても意味がありません (たとえば)。さらにActionbarSherlock、Callback Interface に問題がありLoaderManagerます (解決策はありますが、データ処理クラスが 2 倍になります)。

を介してデータベースとカーソルを直接処理android.database.sqliteすると、リソース管理の問題が発生し (カーソルを閉じてください!)、タスク処理の責任を負うことになります。

私の質問:
Android で SQLite データベースをどのように処理していますか?
さらに一歩進んで実装するのはContentProviderいつLoaderManagerですか?
下位互換性をどのように維持していますか?

私の現在のアプローチ:
データベース I/O (経由android.database.sqlite) をアクティビティから分離するクラスを作成しました。すべてのメソッドは、実行中に (アクティビティの外で) 使用するカーソルを開閉し、必要に応じて (カーソルの代わりに) オブジェクトまたはデータを返します。I/O 操作は で実行されAsyncTasksます。このアプローチは非常に非推奨のようです。

4

1 に答える 1

4

私は最近、同じ単純な sqllite / コンテンツ プロバイダーのジレンマを抱えていましたが、問題を解決するための最も一般的なアプローチはコンテンツ プロバイダーのようです。

公式ドキュメントにそう書いてあったとしても

データを他のアプリケーションと共有するつもりがない場合は、独自のプロバイダーを開発する必要はありません

彼らは、エクスポートされていないコンテンツプロバイダーを使用するオプションを追加しました

android:exported="false"

Reto Meier のProfessional Android Development 4など、私が読んだすべての本は、コンテンツ プロバイダーの使用を提案しています。

さらに、多くのボイラープレート コードを犠牲にして、マルチスレッドやオープン カーソルの問題を忘れることができます。

とにかく、コンテンツ プロバイダーとカーソル ローダーの組み合わせから得られる最大の利点は、基になるデータが変更されるたびにローダーに自動的に通知されることです。

プレーンな sqllite を使用する場合は、データがバックグラウンドで変更されるたびにクライアント クラスに通知する何らかの方法を実装する必要があります。たとえば、ブロードキャストを使用して、intentservice 内でテーブルが更新されたことをアクティビティに通知しました。

最後に、あなたが怒鳴っているすべてのコードの重複に少しがっかりしたので、データ モデルの記述だけを使用してコンテンツ プロバイダーを生成する Python スクリプトを作成することにしました。おそらく、生成されたクラスを変更する必要があります (または、拡張する必要があります) が、かなりの時間を節約できると思います。ここで見つけることができます

結論

  • データを他のアプリにエクスポートしたい場合 (あまり一般的ではありません)、コンテンツ プロバイダーを利用する必要があります
  • データセットがバックグラウンドで変更される可能性があるため、データを観察したり UI を更新したい場合は、コンテンツ プロバイダー + ローダーが非常に強力です。
  • プリロードされたデータ セットがあり、データを表示するのと同じアクティビティでそれを更新する場合、またはテーブルで簡単な操作を実行する必要がある場合、おそらく sqllite ヘルパー クラスで十分です。
于 2012-12-19T21:15:15.190 に答える