Android单服务器多客户端数据同步

时间:2013-09-25 15:38:46

标签: android synchronization client-server data-transfer

这些天我正在使用Android应用程序,我遇到数据同步问题。

我正在使用JSON传输数据。

现在我将解释我的问题。

假设您有一台服务器和多台Android设备之间相互发送数据。我们不仅在Android设备上有相同的数据库表,还有服务器。

系统的操作是这样的:

在一天开始时, Android设备必须从服务器接收数据。

白天, Android设备可以更改自己数据库中的数据,但不会更改服务器数据库中的数据。

在一天结束时 ,Android设备将发送

  • 插入
  • 已更新,
  • 将数据删除到服务器。

我的问题是从这里开始......

我的代码正在记录Android设备中的每个更改,以便在当天向服务器发送。

用户A在白天添加此数据(id = 1024 name = testA value = testAvalue)

用户B在白天添加此数据(id = 1024 name = testB value = testBvalue)

然后用户B想要在白天更改数据名称(id = 1024 name = testC value = testBvalue)

当天,用户A首先将数据发送到服务器。现在服务器有这个数据

(id = 1024 name = testA value = testAvalue)

其次,用户B将数据发送到服务器。 Create(id=1024 name=testB value=testBvalue)

此处此数据ID不是1024,因为服务器数据库的数据ID为1024.新数据ID为1025.

现在服务器有2个数据 (id = 1024 name = testA value = testAvalue) * (id = 1025 name = testB value = testBvalue) *

然后,服务器将收到像这样的编辑命令

Edit(id=1024 name=testC value=testCvalue)

它将编辑1024.数据,这将是错误的

(id = 1024 name = testC value = testCvalue)

(id = 1025 name = testB value = testBvalue)

2 个答案:

答案 0 :(得分:2)

这是典型的“拯救最后胜利的人”问题。您在该字段中有数据的副本,您需要在一天结束时聚合和同步更新。这里的问题不是技术问题,而是设计问题:

“如果更新发生冲突,我如何接受来自多个来源的批量数据更新?”

所以,这确实是一个解决冲突的问题。 “正确”的解决方案将取决于您的应用要求。

一种解决方案是将记录的“所有权”分配给设备,以便只有该设备才能进行更新。一个例子可能是代表被分配客户的销售人员。只有分配给客户端的代理才能更改与该客户端关联的记录。

另一种解决方案是编写用于解决系统冲突的特定规则。您的具体业务案例将确切地确定如何解决每个冲突。只要您的应用程序无法实时更改服务器,这可能是接受来自多个来源的同一记录更新的最佳选择。

答案 1 :(得分:0)

你的一个问题是ID碰撞。您需要根据具体要求为主键选择合适的列类型。

让我提出一些选择(它们都有一些优点和缺点)。

  • 自动增量(标识)列:客户端仅在服务器创建新记录并将新生成的ID发送给客户端后,才创建临时ID并替换为永久ID。
  • 或者服务器将为每个客户端指定ID范围。例如。客户端A将插入1-100000,客户端B:100001-200000等的记录。一旦新记录丰富了范围限制,服务器应发出新范围。
  • GUID:每个客户端将使用新的UUID()命令在插入时生成唯一ID,然后您的服务器将能够毫无问题地插入或更新客户端更改。