web-dev-qa-db-ja.com

同じユーザーからのデータを複数のデバイス間で同期する方法

ユーザー(サーバーで認証されている)がサーバーと同期する独自のワークアウトプランを作成できる小さなフィットネスアプリに取り組んでいます。

これの問題は、ユーザーがアプリを複数のデバイスにインストールした場合、オフラインのときにデバイスAでワークアウトプランのタイトルを編集し、次にオンラインだったデバイスBで同じワークアウトプランのタイトルを再度編集することです。サーバーと同期しました。次に、ユーザーはデバイスAでオンラインになり、サーバーと自動的に同期します。これは、以前のタイトルがユーザーとサーバーと同期されることを意味します。

詳細:

  • ユーザーは、公式のSDKを使用してGoogleサインイン/ FBサインインで認証されます。

  • 認証中に、次のデータがサーバーに追加されます:ID、名前、性別、電子メール、年齢、体重、身長、フォロワー、フォロー、プラットフォーム。

  • ユーザーデータを含むすべてのデータはmysqlデータベースに保存されています

  • サーバーからのすべてのデータはphpを使用してアクセスされます

  • Android=デバイスのユーザーデータは共有設定に保存され、ワー​​クアウトプランのユーザーデータはSQLiteデータベースに保存されます。

私の質問は、「複数のデバイス間で同じユーザーのデータを通常同期するにはどうすればよいですか?」です。これを行う方法についてはすでにわかっていますが、私の前に大量のアプリが同じ問題に遭遇し、これを行う通常の/標準的な方法?ありがとう:)

5
edwinj

ここには本当に2つの懸念があり、それらは主に分散コンピューティングの領域で解決された問題です。

同期していないデータを検出するにはどうすればよいですか?

オブジェクトにはバージョン管理が組み込まれている必要があります。オブジェクトが永続的なストレージ(リレーショナルDB、NoSQL、OODBなど)に保存されるたびに、バージョンを増やします。

アプリが変更をクラウドに同期し、クラウド内のバージョンが編集中のバージョンと一致しないことを検出すると、データは2つの場所で同期されずに2つの場所で編集されたことがわかります。

例:

  1. デバイスAとBの両方がクラウドに同期し、オブジェクトのバージョン1をダウンロードします。
  2. ユーザーはデバイスAでオブジェクトを編集し、WiFiが壊れているためにイライラします。
  3. ユーザーはデバイスBに行き、データを編集します。
  4. デバイスBはクラウドと同期します。両方のレコードはバージョン1にあるため、データをアップロードし、バージョンを2にインクリメントします。
  5. ユーザーはデバイスAに戻り、デバイスAは現在接続されています。
  6. アプリはレコードのバージョン1を持っていることを認識していますが、クラウドはバージョン2を持っています-ローカルの変更がない限り同期します。おっとっと!これは問題であり、簡単に検出されました。

競合を解決するにはどうすればよいですか?

データの性質によっては、この競合を解決するのが容易または困難な場合があります。

ソース管理ソフトウェアは同様の方法で機能し、複数のユーザーが個別にファイルを編集できます。サーバーはリビジョンIDを追跡します。ユーザーが同期を行うと、リビジョンをチェックして更新があるかどうかを確認します。通常、更新が競合していない場合(つまり、同じ行が別のユーザーによって変更されていない場合)、ソフトウェアによって自動的に解決できます。それ以外の場合は、ユーザーの介入が必要になる場合があります(さまざまなVCS戦略の動作は少し異なりますが、概念的なワークフローは似ています)。

これは、実際には、あなたが提示したシナリオとそれほど変わらない。ここには2つの重要な要素があります。

  1. 同じユーザーが両方のデバイスで編集しているため、何をするかを決めるのはユーザーにとってかなり簡単なはずです。

  2. データはdiscreteです。テキストファイルの行のように、テーブル上のこれらの単純なフィールドは、個別の完全なデータエンティティです。

1つのオプションは、2つのバージョンで異なる競合するフィールドを強調表示して、レコードを含む画面を表示することです。次のオプションを指定します。

  1. ローカル編集をクラウドに強制的に適用し、最新のバージョンをオーバーライドします(これは、上の例ではバージョン3になります)。

  2. ローカルの変更を破棄し、クラウドバージョンを受け入れます(2)。

  3. ローカルレコードを編集し、バージョン3として保存して同期します。

5
user22815

私は仕方がありませんが、デバイスに接続していないユーザーがいる場合、そのユーザーは接続されている別のデバイスの情報を更新してから、最初のデバイスに戻り、最初に起こることは、その最初のデバイスはサーバーと同期する必要があります。その時点で、切断されたアプリは、サーバーの発言を受け入れるか、ユーザーに上書きするオプションを提供する必要があります。私の質問は、「ユーザーがデバイスAを最初に接続せずにデバイスBを接続する方法は?」ソース管理のしくみを見てください...職場で変更を加え、同期を忘れ、自宅で変更を加えて同期すると、職場に戻ったときに解決する必要のある同期の競合が発生します。複数のデバイスを中央データベースと同期することは同じように機能します。より詳細な回答を得るためには、現在の状況についてより具体的な情報を提供する必要があると思います。状況によっては、「マージロジック」で書くこともできますが、かなり面倒になる可能性があります...

0
Christine