1

フラグメントまたはアクティビティがsqliteデータベースと対話するためのGoogle推奨の方法(Androidサポートライブラリを使用)は、AsyncTaskLoaderを拡張するローダーを介して行われ、CursorLoaderがContentProviderに対して行う方法と同様に機能するようです。

単一のアクティビティまたはフラグメントは、1つ以上のテーブルのデータを更新、削除、およびクエリするなど、さまざまな方法でデータベースと対話できます。しかし、ローダーにはデータベース操作を実行する場所が1つしかないため(つまり、でloadInBackground())、開発者は、対話のタイプごとに個別のローダーを作成する必要があります。特に、での動作をパラメーター化する唯一の方法loadInBackground()は、? へのargs引数を介したローダーのコンストラクターへの引数LoaderManager.initLoader()

どうもありがとう。

4

3 に答える 3

2

を使用しない場合ContentProvider、つまりsqliteを直接使用するAsyncTaskLoader場合は、実行するデータベース操作のセットが。を返す場合に使用しますCursor。セットには、更新、クエリ、削除、挿入など、あらゆる種類の操作を含めることができます。これらの操作はで実行する必要がありますAsyncTaskLoader.loadInBackground()

Cursorデータベース操作のセットでが返されない場合は、を使用しAsyncTaskます。この場合、操作はで実行する必要がありますAsyncTask.doInBackground()

于 2012-01-27T07:32:17.850 に答える
1

CursorLoaderアプリでを使用することには、2つの主な利点があります。Activity.managedQuery():

  1. クエリはバックグラウンドスレッドで処理されます(AsyncTaskLoader)非常に大きなデータクエリに基づいて構築されているため、UIがブロックされません。これは、プレーンを使用するときにドキュメントで推奨されていることですCursorが、現在は内部で実行されています。
  2. CursorLoader自動更新です。最初のクエリの実行に加えて、CursorLoaderは、要求したデータセットにを登録し、データセットが変更されたときにそれ自体ContentObserverを呼び出します。forceLoad()これによりasync、ビューを更新するためにデータが変更されるたびにコールバックを受け取ることになります。

各ローダーインスタンスも単一のインスタンスを介して処理LoaderManagerされるため、カーソルを直接管理する必要はありません。接続は1つActivity. LoaderManager.initLoader()を超えても維持できLoaderManager.restartLoader()、クエリ用にすでに設定されている既存のローダーに再接続できます。場合によっては、最新のデータが利用可能であれば、すぐに取得できます。

アクティビティまたはフラグメントは、LoaderManager.Callbackインターフェイスを実装する可能性があります。呼び出すinitLoader()と、onCreateLoader()メソッドが生成され、CursorLoader必要に応じてクエリと新しいインスタンスを作成します。このonLoadFinished()メソッドは、新しいデータが利用可能になるたびに起動され、ビューにアタッチしたり、繰り返し処理したりするための最新のカーソルが含まれます。

さらに、LoaderManagerクラスのドキュメントページには、このすべての適合のかなり良い例があります:http: //developer.android.com/reference/android/app/LoaderManager.html

お役に立てば幸いです。

于 2012-01-11T05:44:20.307 に答える
1

以前の回答に基づいて、これがあなたが正確に求めているものであるかどうかはわかりません。ただし、はい。データセットごとに一意のIDを使用してローダーを作成する必要があります。つまり、実行するクエリの種類ごとにローダーを作成する必要があります。

于 2012-06-13T16:13:30.003 に答える