ContentProvider 和多线程

ContentProvider and multi-threading

我一直在想这个场景。

假设我有一个包裹在 ContentProvider 中的 SQLite 数据库,数据库中的数据通过每 10 分钟运行一次的 SyncAdapter 发送到 Web 服务。 要知道哪些行已发送到 Web 服务,使用状态列(0 = 未发送,1 = 已发送)。

应用程序 UI 是一个使用 LoaderManager.LoaderCallbacks 填充的列表,以及用户在其中输入数据的另一个视图(表单)。

SyncAdapter 使用 onPerformSyncContentProviderClient 参数查询未发送的数据 (0) 并将行更新为已发送状态 (1)

造成我困惑的原因是已经发送的数据可以重发几次的场景。用户打开已发送的表单并编辑其数据,这会将状态列更改为 0,因此同步适配器会选择编辑过的行。

现在,假设同步适配器选择一行并开始发送数据,同时用户打开同一数据行,编辑一些列并更新。然后当webservice接收完数据后,sync adapter更新state列为1.

现在该行包含不打算发送的数据。正确的?

我是否应该在从同步适配器更新之前将我发送的所有数据与数据库中的数据进行比较,是这种方法吗?或者我可以使用该框架以更复杂的方式处理这种情况吗?

期待听到您在这种情况下的体验。

你发现你有两个以上的状态:

  • 已更改且必须发送(或重新发送)的行;
  • 已发送但尚未被服务器接受的行;和
  • 服务器接受的行数。

作为@CL。正确地说你有超过 2 个州。

一个简单的解决方案是在转换过程中锁定行以防止其被编辑。