14

SyncAdapterを使用してWebサービスに同期される独自のContentProviderを作成しています。

同期アダプターがコンテンツプロバイダーのデータを変更しているときに問題が発生します。プロバイダーが内部でgetContentResolver()。notifyChangeを呼び出すと、ネットワーク同期がトリガーされ、同期ループが発生します。

ネットワーク同期フラグを指定したnotifyChangeは、クライアントアプリケーションが変更を行う場合に必要ですが、同期アダプターが変更を行う場合は避ける必要があります。

コンテンツプロバイダー内で、クライアントアプリケーション(変更時にネットワーク同期をトリガーする必要がある)または同期アダプター(ネットワーク同期をトリガーしない)によって使用されているかどうかを簡単に判断するにはどうすればよいですか。

現在、異なるCONTENT_URI(同期アダプターはCONTENT_URI_NO_SYNCを使用してデータにアクセスし、クライアントアプリはCONTENT_URIを使用して)を使用して、2つのタイプのアクセスを区別し、それに応じてネットワーク同期フラグを設定しています。

4

1 に答える 1

34

でのRESTAPIの使用法に関するこのビデオSyncAdapterをご覧ください。

彼らが議論する方法は、メタデータフラグ列のセットをデータベースに追加することです。これにより、3つのことが可能になります。

  1. フラグ自体により、はSyncAdapter変更が必要な行とそれらの変更が何であるかを判別できます。ローカルで作成された行とローカルで変更された行の違いをどのように見分けますか?さらに、どのREST API呼び出しを行うかをどのようにして知ることができますか?行を削除しただけの場合、データがなくなった場合に削除する行をどのようにして知ることができますか?SyncAdapter代わりに、「削除する必要があります」フラグを設定すると、SyncAdapter実行時にサーバーに削除をプッシュすることがわかります。

  2. フラグを使用するCursorAdapterと、作成されたビューを変更できます(Spinner「この行が同期されている」ことを示すためにを追加するなど)

  3. 最後に、これは指摘されていませんが、フラグを使用すると、行が変更されている理由を知ることができます。フラグが設定されておらず、行が変更されている場合、サーバーからの更新が原因である可能性があります。したがって、ネットワークに同期する必要はありません。

したがって、2つのワークフローは次のとおりです。

ローカルチェンジ

  1. アプリは新しい行を作成します。行の「作成」フラグはtrueです。
  2. ContentProviderは行を格納し、createフラグを確認して、呼び出しますnotifyChange(...,true);
  3. ネットワークへの同期=true(最後のパラメーター)により起動しますSyncAdapter
  4. SyncAdapterデータベースをスキャンし、作成フラグが設定されている行を見つけて、適切なサーバーアクションを実行します。成功後SyncAdapter、フラグをクリアします。(行の更新ContentProvivder
  5. ContentProviderフラグがクリアされていることを確認し、フラグが設定されたままになっていないため、notifyChange(...、false);を呼び出します。
  6. ContentObserver■フラグの変更を確認し、「同期が終了しました」のように更新します

これらの手順はすべて、更新/削除と同等です。作成/更新/削除ごとに、同期可能な行ごとに1つのフラグがあります。他の勝利にも注意してください-「作成」が一時的に失敗した場合はどうなりますか?サーバーがダウンしています...再試行する方法をどのように知っていますか?-簡単です。「作成」フラグをクリアせず、15分後に表示されます。

リモートチェンジ

  1. SyncAdapter定期的な同期が原因で発生します。
  2. SyncAdapterサーバーから更新をフェッチします。変更をデータベースにプッシュします。フラグを設定しません。 ContentProviderフラグがないことを確認し、変更がサーバーからのものである必要があることを認識している(または、サーバーにプッシュする必要のあるデータベースの変更ではない)ため、notifyChange(...,false);
  3. ContentObserver■コンテンツの変更を確認して、新しい行データで更新します
于 2011-07-06T20:37:09.590 に答える