0

SyncAdapter を使用して RESTful Android アプリを開発しています。いくつかのスクリーンキャストを見て、いくつかのチュートリアルを読みましたが、基本的なダイナミクスしか扱っていません。コードを書き始める前に、専門家のユーザーから並行性の問題についてフィードバックを受けたいと思います。

ステップ 1. ユーザーはデータベースのテーブルにU新しいエントリを挿入します。エントリには列があります。ETstatus = TO_SYNC

ステップ 2. エントリEが同期される前に、エントリUを変更することを決定します。Aの列の値を変更するためのアクティビティが開始されますE

ステップ 3. ユーザーがエントリーを変更している間に、SyncAdapter が始動し、エントリーをstatus == TO_SYNCサーバーに送信します。エントリごとに、サーバーから肯定的な応答を受け取ると、SyncAdapterセットが設定されます。status = SYNCED

ステップ 4. 同じエントリへの同時アクセスEによって競合が発生するとします。

  1. SyncAdapter は を読み取り、サーバーEに送信しますE
  2. アクティビティAが完了し、EステータスがTO_SYNC
  3. SyncAdapter はサーバーから ok を受け取り、statusofEをに設定します。SYNCED
  4. この時点では、値が SyncAdapter によって上書きされているため、新しい値はE同期されません。TO_SYNC

私の質問は、begin/end transaction同期中にデータベース全体をブロックせずにこのような問題を回避するにはどうすればよいですか (完了するまでに時間がかかる可能性があります)。単一のエントリに対して従来の Java ロックを使用する必要がありますか? もっとエレガントな方法はありますか?

4

2 に答える 2

0

LAST_UPDATED_TIME単純なフラグではなくタイムスタンプに基づいてサーバーに同期し ( と呼びます)、別の列 ( と呼びますHASH) と一緒に、行内のすべての値の連結文字列のハッシュ値を保存します。これにより、最後の同期以降のタイムスタンプを確認し、それらの増分データを取得してサーバーに同期し (もちろん別のスレッドで)、結果を取得したら、次の手順を実行します。

  • 現在データベース/行にあるデータのハッシュを、同期されたものと比較します。
  • 上記のステートメントの真実性に基づいて、次の 2 つのことが起こります。
    1. データベース/行のデータのハッシュが同期された値と等しい場合はLAST_UPDATED_TIME、同期の時刻でフィールドを更新するだけです
    2. データベース/行のデータのハッシュが同期された値と等しくない場合は、すぐに行を再度同期します (明らかに、これをさらに最適化できます)。
于 2015-02-15T18:30:06.420 に答える
0

別の方法として、2 番目の列「updated_at」を使用します。

  1. SyncAdapter は E を読み取り、E をサーバーに送信します
  2. アクティビティ A が完了し、E ステータスを TO_SYNC に設定し、NOW で updated_at に設定します。
  3. SyncAdapter はサーバーから ok を受け取ります
  4. SyncAdapter は E_bis を読み取り、E.updated_at と E_bis.updated_at を比較します。異なる場合 => 新しい同期を要求し、そうでない場合 => E のステータスを SYNCED に設定します。
于 2017-06-08T10:15:23.650 に答える