在PhoneGap中与服务器同步数据的策略

时间:2013-11-02 16:54:21

标签: angularjs cordova synchronization

我正在使用AngularJS开始我的第一个PhoneGap项目。它是一个数据库驱动的应用程序,使用REST API作为后端。首先,我根本不会在本地存储数据,因此没有互联网就无法做太多事情。

但是,我最终希望它能在本地存储数据,并在互联网可用时进行同步,因为我知道我个人有时会禁用手机上的互联网连接(飞机,电池电量不足),或者没有酒吧。我想知道你是否可以指出我为这种类型的同步提供一些好的资源。一些推荐的库?或者也许是对陷阱的讨论以及如何环绕它们。我用谷歌搜索了一下,但我想现在,我不知道要问的问题。

另外,我打算首先建立依赖互联网,然后添加同步......这是一个好主意,还是我自己在脚下拍摄?我是否需要从头开始同步建立它?

我有人建议首先将应用程序构建为仅本地应用程序,而不是仅限Internet的部分,它具有一定的逻辑性。远程存储对我来说很重要。我知道决定与我的应用目标有很大关系,但从建立这个目标的角度来看,最终的目标是本地存储+互联网存储,以及双向同步,哪些更容易?或者甚至有所作为?

首先,我正在考虑使用UUID,而不是顺序整数主键。我还想过为每个设备分配一个ID,该ID在它生成的任何键上都有前缀,但这看起来很精致。有人使用过哪种技术?想法?

我想我需要一个好的系统来判断哪些数据已被同步。在客户端,我猜任何创建/编辑的记录都可以标记为同步。但是在服务器端,您有多个客户端,因此不起作用。我想你可以有一个last_updated时间戳,并同步所有更新同步上次成功同步。

在多个地方编辑的记录怎么样?如果两个客户端编辑,然后想要同步,则有一些关于合并的歧义,比如在git或其他版本控制系统中合并分支时。你怎么处理?我猜git通过存储每个提交的差异来做到这一点。我想你可以存储差异?我想的越多,听起来就越复杂。我是在过度思考还是在思考它?

客户端存储怎么样?我已经考虑过SQLite或PhoneGap本地存储事件(http://docs.phonegap.com/en/1.2.0/phonegap_storage_storage.md.html)。建议?同步将通过REST API,交换JSON,所以我在想一些实际上将数据存储为JSON的东西,或者类似JSON的东西,它很容易转换,会很好。另一方面,如果我不得不交换某种数据差异格式,也许这就是我需要存储的内容?

1 个答案:

答案 0 :(得分:26)

让我根据我与同步部分相关的经验提供您的问题的答案,因为我没有足够的PhoneGap经验,因此将跳过有关PhoneGap本地存储v SQLite的问题。

  

我想知道你是否可以指点我为这种类型的同步提供一些好的资源。一些推荐的库?

有许多用于将PhoneGap应用与远程服务器同步的开源项目。但您可能需要根据自己的需要调整它们或实现自己的同步功能。下面我列出了一些开源项目。如果你在网上搜索,你一定已经知道了。

此外,您可能会考虑其他选项,但这取决于您的服务器端:

  

另外,我打算首先建立依赖互联网,然后添加同步......这是一个好主意,还是我自己在脚下拍摄?我是否需要从头开始同步建立它?

我认为同步功能更像是一个额外的模块,不应与其他业务逻辑紧密结合。一旦开始考虑测试同步策略,您就会发现如果您的同步工具与主代码分离,将更容易测试。

我认为您可以使用所需的最低功能尽快启动您的应用,而无需同步。但您最好考虑一下您的架构以及提前添加同步工具的方式。

  

首先,我正在考虑使用UUID,而不是顺序整数主键。我还想过为每个设备分配一个ID,该ID在它生成的任何键上都有前缀,但这看起来很精致。有人使用过哪种技术?想法?

这取决于您的项目规范,特别是您的服务器端。例如,Azure移动服务仅允许主键的整数类型。虽然作为主键的唯一标识符在分布式系统中非常方便(但也有一些缺点)。

与分配设备ID相关 - 虽然我不了解您的项目细节,但我不确定这一点。看看我们系统中使用的同步算法(bidirectional sync using REST between multiple Android clients and central SQL Server)。

  

在多个地方编辑的记录怎么样?如果两个客户端编辑,然后想要同步,则有一些关于合并的歧义,比如在git或其他版本控制系统中合并分支时。你怎么处理?我猜git通过存储每个提交的差异来做到这一点。我想你可以存储差异?我想的越多,听起来就越复杂。我是在过度思考还是在思考它?

您需要考虑如何处理系统中的冲突解决方案。

如果您系统中的冲突概率很高,例如用户将经常更改相同的记录。然后,您最好跟踪同步中已修改记录的哪些字段(列),然后在检测到冲突后:

  1. 遍历冲突中服务器端记录的每个已修改字段
  2. 将服务器记录的每个修改字段与客户端的相关字段进行比较。
  3. 如果客户端字段未被修改,则没有冲突,因此只需用服务器字段覆盖它。
  4. 否则会发生冲突,因此请将两个字段的内容保存到报告的临时位置
  5. 在同步结束时生成冲突记录报告。