11

我正在使用 jqueryMobile + 淘汰赛 + 微风 + WebAPI 编写一个简单的“todo - helloworld”,以了解移动环境中的 SPA(单页应用程序)(不可靠的互联网连接)

为了启用离线使用,WebApp 将利用

  • 应用程序缓存
  • 本地存储

应用程序应尽可能使用远程数据库来加载和保存数据,但应能够在离线时无缝切换到本地存储,并在重新在线时同步本地/远程更改。

现在回到问题:应用程序将使用 Breeze 的 EntityManager 来管理数据(本地缓存和远程同步)

  • “远程数据库”

为了减轻不一致/并发问题,我将使用 2 个本地存储密钥:

  • “localDb”用于远程数据库的本地副本(待办事项列表)
  • “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

这似乎是合理的,不太确定为什么需要两个 localStorage 键。保存在 localStorage 中的每个实体的 entityState(未修改、修改、添加、删除),因此您始终可以从任何本地副本中“提取”(参见 EntityManager.getEntities 方法)只是待处理的更改。那么为什么不在关闭应用程序之前将整个 entityManager 状态保存到 localStorage。

至于并发问题,您绝对应该在每个 entityType 上设置一个并发属性。只要存在这种情况,并且如果您通过实体框架进行保存,那么微风就会在保存期间检测到任何乐观并发违规并抛出异常。显然,在出现此类异常后,您已经确定了应用程序的正确行为。

我相信您已经看到了,但是 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 回答