0

データベースフレームワークを実装する「Android の方法」とは何ですか?

2 つの目標:

  1. 「データベース」がsqliteデータベースまたはネットワーク上の何かになるように、十分に一般的である必要があります。
  2. マルチスレッドセーフである必要があります。(更新:「スレッドセーフ」とは、メイン UI スレッドで実行してはならず、データベース呼び出しが互いに競合してはならず、システムが結果をメイン UI スレッドに戻す方法を認識している必要があることを意味します。)
  3. 更新:構成の変更 (電話の向きの変更など) を認識する必要があります。

これは、ここと Android ドキュメントから収集したものです。

  1. データのクエリには LoaderManager を使用します。
  2. ContentProvider を作成します (1 & 2 でスレッドセーフになります)
  3. ContentProvider とデータの間に追加のクラスを配置します。

しかし、データの作成、更新、および削除についてはどうでしょうか。私が知る限り、LoaderManager はクエリ専用です。AsyncQueryHandler を使用する必要がありますか?

更新: AsyncQueryHandler は構成の変更を認識しません。Fragmentsが進むべき道かもしれないと読みました。または... AsyncQueryHandler 実装が構成の変更を処理することを確認する必要があります。

4

1 に答える 1

1

(1) は非常に簡単です。ContentProvider と、すべての低レベル CRUD を実装するデータとの間に追加のクラスを配置するだけです。たとえば、あるクラスは sqlite データベースを処理でき、同じインターフェイスを持つ別のクラスは Google ドライブ バックエンドを処理できます。

いくつかの調査を行った後、Android クラスで (2) と (3) を処理する方法を次に示します。

  • AsyncTask - 残念ながら、AsyncTask は構成の変更を認識しないため、自分で作成する必要があります (見苦しくなります)。
  • ヘッドレス フラグメント - UI のないフラグメント。基本的に、独自の AsyncTaskLoader を作成して、ポイントを無効にする必要があります。(こちらhttp://blogactivity.wordpress.com/2011/09/01/proper-use-of-asynctask/を参照)
  • AsyncTaskLoader - 進むべき道のようです

ローダーはデータをロードするように設計されていますが、ローダーをハックして挿入/更新も処理できます。( loadInBackground() メソッドでは何でもできます。)

問題は、HoneyComb の前は、すべてのローダーがスレッド プールを共有してリクエストを並行して実行していたことです。(HoneyComb の後、ローダーはタスクを順番に実行します。) これは、互いに直後に実行されるタスクが順番に実行されるとは限らないだけでなく、マルチスレッドを正しく処理しないとデータの一貫性の問題が発生することを意味します。

データベースを更新するサービスをバックグラウンドで実行している場合でも、Honeycomb 後のマルチスレッドについて心配する必要があります。

肝心なのは、「データベース呼び出しが互いに競合してはならない」という問題を抽象化する Android フレームワークがないように見えるということです。あなたはそれを自分で処理しなければなりません。

于 2013-07-14T00:15:06.580 に答える