【问题标题】:Android SyncAdapter and concurrent write accessesAndroid SyncAdapter 和并发写访问
【发布时间】:2017-06-08 18:15:23
【问题描述】:

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

步骤 1. 用户 U 将新条目 E 插入到数据库的表 T 中。该条目有一列status = TO_SYNC

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

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

第 4 步。假设同时访问同一条目 E 会导致冲突:

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

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

【问题讨论】:

    标签: android-syncadapter database-concurrency


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      另一种方式,第二列“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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-26
        相关资源
        最近更新 更多