jQuery Mobile的离线/在线数据库身份验证/同步

Xax*_*axD 5 jquery html5 session-storage offline-caching jquery-mobile

情况:我有一个数据库和一个互动的网络应用程序,用于显示和更新科学数据表.我的任务是构建一个允许用户使用的移动应用程序

  1. 为跟踪目的进行身份验证和识别自己离线(使用存储在缓存中的预定义但动态的用户帐户和权限)
  2. 下载现场工作识别数据(可上网)
  3. 在现场制作和存储观察(无法访问互联网)
  4. 稍后将观察结果同步到在线数据库中

问题:对于管理此类应用程序而不依赖于一致的互联网访问,进行身份验证/下载/存储/上传必要数据的最佳方法是什么?如果两个人调整相同的读数,并且在同步之间发生一次更新,我如何跟踪哪些表和值已被更改,并防止更改丢失?

当前的思路:我目前关于碰撞控制的暂定策略是维护一个"同步"表,该表存储代表存储在sessionStorage中的每个在线数据库事务的JSON对象,并让应用程序在上传数据之前不断验证其同步,并检查此对象对特定主键更新的潜在冲突.我希望能够在编辑阶段锁定元组,但由于互联网访问不一致,这似乎是不可能的.

对不起,如果这是一个新问题,我是整个移动应用程序开发的新手......

tl; dr如何防止数据库的异步更改从进行和离线的移动应用程序覆盖/与另一个人对同一数据库的更改发生冲突?我如何验证没有网络连接的用户?

fre*_*ent 2

至于同步,你可以看看jIO——我们正在开发的一个开源库,它可以跨不同类型的存储同步 JSON 文档,并且有一个超级简单的 API。

有许多可用且正在开发的连接器(webDav、S3、xwiki 等),您还可以编写自己的连接器来将 JIO 连接到您提供 JSON 数据的任何位置。

然后,在客户端上,您可以使用客户端本地主机和远程存储作为存储来设置复制修订存储:

 var jio_instance = jIO.newJio({
   "type": "replicaterevision",
   "storage_list": [{
     "type": "revision",
     "sub_storage": {<storage spec for your localhost storage>}
    }, {
     "type": "revision",
     "sub_storage": {<storage spec for your remote storage>}
    }]
 });
Run Code Online (Sandbox Code Playgroud)

中的所有存储storage_list将自动进行版本控制和同步。因此,如果用户离线,检索文档,编辑并保存它(仅保存到本地存储,因为用户离线),jIO 将在用户下次尝试在线访问该文件时引发冲突,因为当前版本在remote-storagelocalstorage有所不同。

那么只需编写一个例程来解决多个用户在线/离线编辑文档时产生的冲突=保留/合并/等版本。

访问文档相当简单。JSON 文档具有元数据和附件,您可以使用以下命令来修改 JSON 文档:

  POST  > generate a new document
  PUT > update existing document
  GET > retrieve a document
  REMOVE > delete a document
  ALLDOCS > retrieve all documents
  PUTATTACHEMENT > add an attachment to a document
  GETATTACHEMENT > retrieve an attachment from a document
  REMOVEATTACHEMENT > delete an attachement from a document
Run Code Online (Sandbox Code Playgroud)

像这样调用:

  jio_instance.get({"_id":"your_doc_id"}, function (err, response) {
    // do something
  });
Run Code Online (Sandbox Code Playgroud)

JIO 还有一个complex-queries模块,允许在存储上运行类似数据库的查询。所以你可以这样做:

options = {
 query: '(author:"% Doe") AND (format:"pdf")',
 limit: [0, 100],
 sort_on: [['last_modified', 'descending'], ['creation_date', 'descending']],
 select_list: ['title'],
 wildcard_character: '%'
};

// run query
jio_instance.allDocs(options, function (error, response) {
  // do sth
});
Run Code Online (Sandbox Code Playgroud)

如果您有任何疑问,请告诉我。