0

我正在使用 SyncAdapter 开发一个 RESTful Android 应用程序。我观看了一些截屏视频并阅读了一些教程,但它们仅涉及基本动态。在开始编写代码之前,我想尝试从专家用户那里获得有关并发问题的反馈。

步骤 1. 用户在数据库表中U插入一个新条目。该条目有一列。ETstatus = TO_SYNC

E步骤 2. 在同步条目之前,U决定对其进行修改。一个活动A开始用于修改 的列值E

步骤 3. 当用户修改条目时,SyncAdapter 启动并将条目发送status == TO_SYNC到服务器。对于每个条目,一旦收到来自服务器的肯定回答,就会设置SyncAdapterstatus = SYNCED

第 4 步。假设对同一条目的并发访问E会导致冲突:

  1. SyncAdapter 读取E,发送E到服务器
  2. 活动A完成并将E状态设置为TO_SYNC
  3. SyncAdapter 从服务器接收到 ok 并将statusof设置ESYNCED
  4. 此时E将不会同步 的新值,因为该值TO_SYNC已被 SyncAdapter 覆盖。

我的问题是:如何在不阻塞整个数据库的情况下避免这样的问题,begin/end transaction同时同步(这可能需要很长时间才能完成)?我应该在单个条目上使用经典的 java 锁吗?有没有更优雅的方式?

4

2 回答 2

0

您可以基于时间戳(称为它LAST_UPDATED_TIME)而不是一个简单的标志同步到服务器,并与另一列中的标记一起(称为它HASH)存储一行中所有值的串联字符串的哈希值。有了这个,您可以检查自上次同步以来的时间戳,获取要同步的增量数据并同步到服务器(当然在单独的线程中),当您返回结果时,您将执行以下步骤:

  • 将数据库/行中当前数据的哈希值与同步的数据进行比较。
  • 基于上述陈述的真实性,可能会发生两件事:
    1. 如果 db/row 中数据的哈希值等于同步的值,则只需LAST_UPDATED_TIME使用同步时间更新字段
    2. 如果 db/row 中数据的哈希值不等于已同步的值,则立即再次同步该行(您显然可以进一步优化)
于 2015-02-15T18:30:06.420 回答
0

另一种方式,第二列“updated_at”

  1. SyncAdapter 读取 E,将 E 发送到服务器
  2. 活动 A 在 NOW 完成并将 E 状态设置为 TO_SYNC 和 updated_at
  3. SyncAdapter 从服务器接收到 ok
  4. SyncAdapter 读取 E_bis,比较 E.updated_at 和 E_bis.updated_at,如果不同 => 请求新同步,否则 => 将 E 的状态设置为 SYNCED
于 2017-06-08T10:15:23.650 回答