6

この質問は何度も聞かれていることは知っていますが、私が対象としている問題は少し異なり、おそらくもっと複雑だと思います。

RESTful Webサービスを使用し、次の要件が必要なアプリケーションを開発します。

  • アプリは、いくつかの本、その著者、および編集者をリストに詳細に表示する必要があります

  • アプリは本の検索も許可する必要があります

  • 書籍、著者、編集者は、RESTfulWebサービスから取得されます

  • アクティビティを開くと、古いデータ(存在する場合)が最初に表示され、新しいデータがネットワークから更新されるように、すべてのエンティティをキャッシュする必要があります。

  • エンティティが更新されるたびに、関係者に通知する必要があります(ContentObserver?通常のListener実装?)

  • 呼び出しがすでに実行されている場合(toapi/books/1337またはtoなどapi/editors)、呼び出し元にデータをロードしていることを通知し、元の呼び出し元であるかのように古い呼び出し元(存在する場合)を与える必要があります。

  • 一部のデータ(本と著者のみ)はN分ごとに更新する必要があり(ユーザーが決定)、オブザーバーに通知する必要があります(SyncAdapter?)

質問

Google I / O2010でVirgilDobjanschiによって提案されたすべてのコンポーネントを見て研究した後、ここに私の疑問があります。

  1. 発信者の「エンティティが更新されている」という概念を透過的に処理するにはどうすればよいですか。実装する必要があるので使用する必要ContentObserverContentProviderありますか?

  2. Iを使用するContentObserverと、(Dobjanschiによって提案されたように)単一のエンティティのステータスフラグを簡単に設定できます。たとえば、、などUPDATINGですINSERTING。しかし、リストをどのように処理する必要がありますか?書籍のリストが必要だとしましょう。ステータスフラグはどこに置くべきですか?リストのみのステータステーブルに入れる必要がありますか?もしそうなら、私は2つのを観察するCursor必要があります。1つはステータス用で、もう1つは実際のリスト(つまり、テーブル/コンテンツURI)用です。そして、私が求めているエンティティが(まだ)存在しない場合、またはREST呼び出しがを返す場合はどうなり404ますか?コールバックを処理するにはどうすればよいですか?

  3. すべてのRESTメソッドをに配置した場合、ネットワークからエンティティ/エンティティリストを更新するよう**SyncAdapter**に「強制」できますか(したがって、適切なテーブルに配置できますか)。SyncAdapterこのように、ステータスフラグが役立ちます。

  4. メソッドしかないので、複数のエンティティ(実際には、本や編集者を時々更新したいので、エンティティリスト)でSyncAdapter作業できますか?performSync

  5. 私のSyncAdapter実装がデバイス設定でユーザーによって無効にされている場合、それは何も更新しません(そしてそれは問題ありません)。しかし、ユーザーがアクティビティの[書籍を更新]ボタンをクリックした場合でも、performSyncメソッドを呼び出すことはできますか、それとも無効になりますか?

4

2 に答える 2

10

SyncAdapterは、次の5つのコンポーネントを含むデザインパターンです。

  1. アプリ。これは、とのセットを使用しActivityCursorおそらくContentObserverCursorAdapterいくつかを使用して、からローカルに保存されたデータにUIを提供しますContentProvider
  2. ContentProvider ローカルデバイスのデータストア。CRUD呼び出しを処理SyncAdapterし、サーバーに更新をプッシュする必要があることを通知します。
  3. Accountリモートサーバー上のユーザーID。
  4. SyncAdapter実行され、ローカルデータストアとサーバーの同期を維持するバックグラウンドプロセス。
  5. サーバー自体。

それで。質問へ:

  1. 「更新中」とは、「まだサーバーにプッシュされていないローカル変更があることを意味します。これは、データベースの行に設定するフラグです。行を作成/更新/削除するときにContentProviderに設定されます。SyncAdapterが実行されるとき、フラグを確認し、更新をサーバーにプッシュし、フラグをクリアします。フラグ自体は2つのことを行います。a
    アプリが変更の保存でビジーであることをユーザーに通知します
    。b。 行を変更済みとしてマークします。 SyncAdapterは、サーバーにプッシュすることを認識しています。詳細については、
    こちらをお読みください。

  2. カタログ全体を同期していない場合、クライアントはサーバーに直接クエリを実行し、結果をContentProviderに配置してキャッシュします。サーバーから送信され、サーバーの状態と一致するため、ステータスフラグはありません。SyncAdapterを作成して無視するか、数日キャッシュされた後で破棄します。

  3. a。ローカル更新がサーバーに送信されるようにするには、ContentProviderのCreate / Update /Delete呼び出し中にSyncAdapterに通知するようにContentProviderを記述します。(ここを読んでください...)
    b。サーバーから定期的に更新を取得するには、自動同期用にアカウントを構成します。 (ここを読んでください...)

  4. はい。PerformSyncは単なる関数呼び出しです。あなたがやりたいことをするためにそれを書いてください。サーバーからテーブル1をフェッチし、ContentProviderの1つのテーブルに配置します。次に、テーブル2をフェッチして、別のテーブルに配置します。等。

  5. a。extrasバンドルContentResolver.RequestSync()でwithを呼び出すことにより、同期を強制できます。b。クライアントコードを使用して手動で何かをフェッチし、それをContentProviderに直接プッシュできます。ContentResolver.SYNC_EXTRAS_MANUAL

于 2012-09-18T14:58:52.393 に答える