Android SyncAdapter和并发写访问

时间:2015-02-03 11:03:10

标签: android-syncadapter database-concurrency

我正在使用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并将status E设置为SYNCED
  4. 此时E的新值将不会同步,因为SyncAdapter已覆盖了值TO_SYNC
  5. 我的问题是:如何在不同步时使用begin/end transaction阻止整个数据库来避免此类问题(可能需要很长时间才能完成)?我是否应该依靠单个条目的经典java锁定?有更优雅的方式吗?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

另一种方式,第二列" updated_at"

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