11

jqueryMobile +ノックアウト+そよ風+ WebAPIを使用して、モバイルコンテキスト(信頼できないインターネット接続)でSPA(シングルページアプリケーション)について学ぶ簡単な「todo - helloworld」を書いています。

オフラインでの使用を有効にするために、WebApp は活用します

  • アプリケーションキャッシュ
  • ローカルストレージ

アプリは、データの読み込みと保存に可能な限りリモート データベースを使用する必要がありますが、オフラインの場合はローカル ストレージにシームレスに切り替え、オンラインに戻った場合はローカル/リモートの変更を同期できる必要があります。

質問に戻ります。アプリは Breeze の EntityManager を使用してデータを管理します (ローカル キャッシュとリモート同期)。

  • 「リモートデータベース」

不整合/同時実行の問題を軽減するために、2 つの localstorage キーを使用します。

  • リモート データベースのローカル コピー用の「localDb」(todo のリスト)
  • アプリがリモート データベースに送信できなかった変更の「localPendingChanges」

したがって、フローは多かれ少なかれ次のようになります (疑似コード):

LoadData
  if(online)
    load remoteDb
    save localDb                   // save a local copy of the fresh loaded remotDb
    if(localPendingChanges)
      load localPendingChanges     // we are merging in the Breeze entityManager remote data with localPendingChanges
      Savedata                     // we are online and we have pending changes, so we should sync everything back to the remoteDb as soon as possible
  if(offline)
    load localDb
    if(localPendingChanges)
      load localPendingChanges     // we are merging in the Breeze entityManager local data with localPendingChanges

SaveData
  if(online)
    save remoteDb
    clear localPendingChanges      // until we are online there is no need to keep localPendingChanges
    LoadData                       // we are loading data from remoteDb to update our localDb to the latest version
  if(offline)
    save localPendingChanges       // we are saving only the changes to localstorage

このアプローチについてどう思いますか?めちゃくちゃですか?大丈夫ですか?マルチ ユーザー シナリオでの同時実行の問題についてはどうでしょうか。

4

2 に答える 2

4

これは妥当なようですが、なぜ2つのlocalStorageキーが必要なのかよくわかりません。localStorageに配置されたすべてのエンティティのentityState(変更されていない、変更された、追加された、削除された)が維持されるため、ローカルコピーから保留中の変更のみを常に「抽出」できます(EntityManager.getEntitiesメソッドを参照)。したがって、アプリをシャットダウンする前に、entityManagerの状態全体をlocalStorageに保存してみませんか。

並行性の問題については、各entityTypeに並行性プロパティを確実に設定する必要があります。これが存在する限り、Entity Frameworkを介して保存している場合、breezeは保存中に楽観的同時実行性違反を検出し、例外をスローします。明らかに、このような例外の後、アプリの正しい動作を決定しました。

ご覧になったと思いますが、QueryOptions.MergeStrategy(PreserveChanges、OverwriteChanges)は、クエリ後にローカルマシン上のデータを保持または上書きするのに非常に役立ちます。

于 2012-12-12T19:34:02.220 に答える
3

サーバーと同期されたものとは別の場所にローカルの変更を保持することは正しいと思います。私はこの問題に数ヶ月取り組んできましたが、セット内のキー内のすべてのデータとすべてが個別にバージョン管理されるバージョン管理システムに非常によく似たものを思いつきました。サーバーからローカル データベースに変更をダウンロードできます。変更が競合解決コールバックを通じて両側で変更されている場合は処理されます。

現時点では Knockout についてはよくわかりませんが、ライブラリ自体は個別のプロジェクトに依存しておらず、Node.JS、Dojo、jQuery のテスト ケースに合格しています。非常にタイトな API (.get、.set、.feed (サーバーからダウンロードしたデータをロードするため) と .getFirst (アップロードする必要があるものへのアクセスを取得するため)) があります。

URL はhttps://github.com/forbesmyester/SyncItで、かなり包括的なデモとドキュメントもあります。

于 2013-06-02T20:18:02.410 に答える