5

私のアプリケーションでは、多くのCRUDが必要です。ローカルのSQLiteデータベースからレコードを読み取り、オブジェクトを挿入し、更新します。ほとんどのクエリは非常に単純なので、UIスレッドで実行してもブロックされませんが、このアプリケーションでは、Windows Phoneパターンを採用したいと思います。アウトアニメーションはすぐに開始され、インアニメーションは結果が配信されたときに開始されます。

私はその仕事にを使用することを計画しましたが、Honeycomb(およびcompatパッケージ)がこの新しいローダーフレームワークAsyncTaskを導入していることに気づきました。主な利点は、サバイブ構成によってロードされたデータが変更されることです。CommonswareによるLoaderExプロジェクトは、SQLiteとフレームワークの間を橋渡ししますが、いくつかの問題が発生します。Loader

  1. リソースのクリーンアップ:単一のアクティビティを使用し、SQLiteOpenHelperを作成してonCreate()閉じますonDestroy()。ローダーマネージャーはまだ実行されている可能性があるため、ローダーマネージャーを確認pendingCloseし、コールバックオブジェクトにフラグを設定します。これにより、読み込みが完了するとカーソルとヘルパーが閉じます。データベースを閉じないことは有害ではないと思いますが、そうしないとSQLiteが文句を言い、エラーメッセージは好きではありません:)ここでのポイントは、データが構成の変更に耐えられないため、ローダーの利点がなくなることです。

  2. ローダーはいくつ作成する必要がありますか?私が最愛の人CustomerOrderテーブルを持っているとしましょう。ローダーはまたはIDのように識別されCUST_LますORD_Lが、ユーザーが要約をクリックするたびに、詳細を含む画面を表示したいと思います。異なるパラメーターをrestart持つローダーを使用する必要がありinitますか、それともランダムなIDを使用する新しいローダーを使用する必要がありますか?これは何十回も発生する可能性があります。ローダーフレームワークは、多くの小さな実行中のジョブを対象としていますか、それともいくつかの長時間実行中のタスクを対象としていますか?

  3. インターフェイスID内でのを使用する目的は何ですか?LoaderCallbacksなぜ単純ではないのinitLoader(params, callback)ですか?コールバック内でロジックの一部を再利用できるとは思いません。最終的には(IDを使用してif-elseまたはIDで)分岐するため、単純なアプローチswitchではなく、コールバックオブジェクトに識別子を指定する意味がわかりません。操作ごとのコールバック

フレームワーク全体が私には過剰に設計されており、実際の有用性がないように思われるため、これを求めています。を使用してコードを一元化することのポイントがわかりません。LoaderManagerまた、新しい機会が提供されAsyncTaskなかったことがわかりません。

SQLiteOpenHelper唯一の勝利のポイントは、構成変更の存続ですが、リソースのクリーンアップのためにそれを利用することはできません。また、(明らかに)必要であるため、それを閉じるための代替方法を見つけることはできませんSQLiteCursorLoaderが、クリーンアップはユーザー。だからAsyncTaskここで勝者の選択のようですが、多分私は何かが欠けています。

4

1 に答える 1

4
  1. コンテンツプロバイダーは、「raw-DB」アプローチよりもはるかに強力です。スタックオーバーフローに関する多くのリンクは、これに関する議論につながります。
  2. LoaderManagerは、ローダーをIDで区別しようとします(initLoaderのシグニチャーがこの引数を指定する理由)。特定のIDを持つローダーのデータがすでに存在する場合にキャッシュされた結果を再配信するには、ローダーのIDが必要です(したがって、非同期で再度ロードする必要はありません)。
  3. restartLoader call forces LoaderManager to initiate async opertation specified by previously created loader. initLoader attempts to reuse existing loader before creating a new one.
  4. Fragments and Activities have their own LoaderManagers that don't overlap.

My experience shows that even though using Content Providers sounds like overkill to implement, it actually pays off pretty good in the future. Performance hit is insignificant (tried measuring it), UI-Data bindings are added out of the box (because of content observer and CursorLoaders being able to subscribe to Uri notifications), synchronicity implemented by framework via loaders. IMHO, whenever database is needed, using content provider with loaders most of the times is the best solution you can come up with.

Other scenarios that involve using database directly, will force you to implement everything manually.

于 2013-02-12T01:57:37.180 に答える