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



这些天我正在开发一个Android应用程序,我在数据同步方面遇到了问题。

我正在使用 JSON 来传输数据。

现在我将解释我的问题。

假设您有一台服务器和多个Android设备,它们在彼此之间发送数据。我们不仅在安卓设备上有相同的数据库表,而且在服务器上也有相同的数据库表。

系统操作是这样的:

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

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

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

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

我的问题从这里开始。

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

用户 A 在白天添加此数据(id=1024 名称=测试A 值=测试A值(

用户 B 在白天添加此数据(id=1024 名称=testB 值=testB值(

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

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

(id=1024 名称=测试A 值=测试A值(

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

这里这个数据ID不会是1024,因为服务器数据库有id为1024的数据。新的数据 ID 将为 1025。

现在服务器有 2 个数据(id=1024 名称=测试A 值=测试A值(*(id=1025 名称=测试B 值=测试B值(*

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

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

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

(id=1024 名称=testC 值=testC值(

(id=1025 名称=测试B 值=测试B值(

这是一个典型的"最后保存的人获胜"的问题。 您在外业中拥有数据的副本,并且需要在一天结束时聚合和同步更新。 这里的问题与其说是技术问题,不如说是设计问题:

"当更新发生冲突时,如何接受来自多个源的批量数据更新?">

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

一种解决方案是将记录的"所有权"分配给设备,以便只有该设备可以进行更新。 例如,销售人员在其中为代表分配了客户。 只有分配给客户端的代表才能更改与该客户端关联的记录。

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

您的问题之一是 ID 冲突。您需要根据特定要求为主键选择适当的列类型。

让我建议几个选项(它们都有一些优点和缺点(。

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

最新更新