アクティビティまたはフラグメントには、実行される各データベース操作のタイプ用の個別のローダーが必要ですか?
質問
SQLiteデータベースと対話するためのフラグメントまたはアクティビティのGoogleが推奨する方法(Android Support Libraryを使用)は、AsynctaskLoaderを拡張し、CoursorLoaderがContentProviderの場合と同様の動作をするローダーを介して行われます。
単一のアクティビティまたはフラグメントは、さまざまな方法でデータベースと対話し、1つ以上のテーブルでデータを更新、削除、およびクエリする場合があります。しかし、ローダーにはデータベース操作を実行する場所が1つしかないためです(つまり、 loadInBackground()
)、開発者は、インタラクションの種類ごとに個別のローダーを作成することが期待されています。 loadInBackground()
ローダーのコンストラクターに引数を渡すことによって args
への議論 LoaderManager.initLoader()
?
どうもありがとう。
解決
使用していない場合 ContentProvider
, 、つまり、sqliteを直接使用する場合、使用します AsyncTaskLoader
実行されるデータベース操作のセットが Cursor
. 。セットには、任意の種類の操作、更新、クエリ、削除、挿入が含まれます。これらの操作はで実行する必要があります AsyncTaskLoader.loadInBackground()
.
データベース操作のセットが次のようになっていない場合 Cursor
返品されて、使用してください AsyncTask
. 。この場合、操作はで実行される必要があります AsyncTask.doInBackground()
.
他のヒント
使用することには2つの重要な利点があります CursorLoader
あなたのアプリで Activity.managedQuery():
- クエリはあなたのためのバックグラウンドスレッドで処理されます(ビルドの厚意により
AsyncTaskLoader)
したがって、大規模なデータクエリはUIをブロックしません。これは、ドキュメントが平野を使用するときにあなた自身のために行うことを推奨するものですCursor
, 、しかし今ではそれはボンネットの下で行われています。 CursorLoader
自動更新です。最初のクエリの実行に加えて、cursorloaderはContentObserver
要求したデータセットを使用して電話をかけますforceLoad()
データセットが変更されたときにそれ自体。これにより、あなたが得ることになりますasync
ビューを更新するために、データが変更されるたびにコールバック。
各ローダーインスタンスは、単数形を介して処理されます LoaderManager
, 、そのため、まだカーソルを直接管理する必要はありません。これで、接続が単一を超えても持続することができます Activity. LoaderManager.initLoader()
と LoaderManager.restartLoader()
すでにクエリ用に設定されている既存のローダーで再接続し、場合によっては、利用可能な場合に最新のデータを即座に取得できます。
あなたのアクティビティまたはフラグメントは、おそらく実装されます LoaderManager
.Callbackインターフェイス。電話 initLoader()
oncreateloader()メソッドがクエリを作成し、新しいものを作成します。 CursorLoader
必要に応じて、インスタンス。 onLoadFinished()
新しいデータが利用可能になるたびにメソッドが起動され、ビューに添付したり、反復したりするための最新のカーソルが含まれます。
さらに、このすべてのフィッティングが一緒になっているかなり良い例があります LoaderManager
クラスのドキュメントページ: http://developer.android.com/reference/android/app/loadermanager.html
それが役立つことを願っています!
以前の答えに基づいて、これがあなたが正確に求めていることであるかどうかはわかりません。ただし、はい、各データセット、つまり実行する各タイプのクエリに対して一意のIDを備えたローダーを作成する必要があります。