在PhoneGap中与服务器同步数据的策略[关闭]

Posted

技术标签:

【中文标题】在PhoneGap中与服务器同步数据的策略[关闭]【英文标题】:Strategies for syncing data with server in PhoneGap [closed] 【发布时间】:2013-11-13 16:38:30 【问题描述】:

我正在使用 AngularJS 开始我的第一个 PhoneGap 项目。它是一个数据库驱动的应用程序,使用 REST API 作为后端。首先,我根本不打算在本地存储数据,所以如果没有 Internet,它就不会做很多事情。

但是,我最终希望它在本地存储数据,并在 Internet 可用时进行同步,因为我知道我个人有时会禁用手机上的 Internet 连接(飞机、电池电量不足),或者没有连接。我想知道您是否可以为我指出一些用于此类同步的好资源。一些推荐的图书馆?或者也许是一些关于陷阱以及如何绕过它们的讨论。我用谷歌搜索了一下,但我想现在,我不知道要问什么问题。

另外,我打算首先构建它依赖于 Internet,然后添加同步....这是个好主意,还是我在自找麻烦?我需要从一开始就同步构建它吗?

有人建议首先将应用程序构建为仅限本地,而不是首先构建仅限 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 的东西会很好。另一方面,如果我必须交换某种数据差异格式,也许这就是我需要存储的内容?

【问题讨论】:

有人用过这个吗? pouchdb.com 似乎与我的很多担忧有关,但如果你一直在这条路上,很想听听你的想法? 【参考方案1】:

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

我想知道您是否可以为我指出一些用于此类同步的好资源。一些推荐的库?

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

PhoneGap sync plugin Simple Offline Data Synchronization for Mobile Web and PhoneGap Applications Synchronize a local WebSQL Db to a server Couchbase Lite PhoneGap plugin

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

Microsoft Sync Framework Toolkit(提供Html5样例) OpenSync Framework - 独立于平台的通用同步引擎

另外,我打算首先构建它依赖于 Internet,然后添加同步....这是个好主意,还是我在自找麻烦?我需要从一开始就同步构建它吗?

我认为同步功能更像是一个附加模块,不应与您的其他业务逻辑紧密耦合。一旦您开始考虑同步的测试策略,您就会意识到如果您的同步工具与主代码分离,那么测试会更容易。

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

首先,我正在考虑使用 UUID,而不是顺序整数主键。我还考虑过为每个设备分配一个 ID,该 ID 以它生成的任何键为前缀,但这似乎很微妙。有人用过这两种技术吗?想法?

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

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

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

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

如果您的系统中发生冲突的可能性很高,例如用户将经常更改相同的记录。然后,您最好跟踪同步中记录的哪些字段(列)被修改,然后一旦检测到冲突:

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

【讨论】:

设备 ID 背后的想法是让每个设备使用自己的顺序 ID,但前缀是自己唯一的设备 ID。例如,我的设备将获得 ID 1,而您的设备将获得 2。然后您创建我创建 ID 为 1 的记录,但如果您愿意,它将类似于 2-1 或 2-00001。然后当我创建我的第一条记录时,它将是 1-1 或 1-00001。所以每个设备保持自己的序列,并按顺序创建ID,但它们可以合并,因为前缀区分它们。我不喜欢那个解决方案,虽然我不能完全说明原因。 很多很棒的信息@Havrl。谢谢! 我倾向于 UUID。我的服务器端将由我指定。我最初考虑的是 PostgreSQL 或 mysql,但当我读到 CouchDB 时,这听起来很有吸引力。 应用程序移动部分的主要用例是记录购买。您不会那么频繁地编辑现有数据,尽管这是可能的。编辑时,您不会编辑每个人的数据,只会编辑您自己的数据。但是,每个家庭都有一个帐户,因此您将有 2-4 个用户共享一个给定的记录集,并且他们可能会在编辑时互相踩踏。主意。如果我使用 NoSQL 解决方案,例如 CouchDB 或 MongoDB,我想知道是否可以为每个帐户提供自己的集合。与同步无关,但搜索速度更快。 CouchDB 更适合数据同步。

以上是关于在PhoneGap中与服务器同步数据的策略[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

围绕DataTable';允许在Rails应用程序中与服务器端分页同步的ajax方法

在 ipad 和 iphone 之间同步 Phonegap 应用程序数据

在 django 中与应用程序服务器/网络服务器进行通信的最佳方式是啥[关闭]

使用 Phonegap 创建 Android 服务? (即使关闭也可以运行phonegap应用程序)

iOS中与真实对象匹配的图像[关闭]

将 Android 应用数据库与远程 API 同步的策略