2011-07-05 68 views
14

我正在编写自己的ContentProvider,它将使用SyncAdapter同步到Web服务。防止网络同步循环在Android ContentProvider网络中同步

当同步适配器修改内容提供者的数据时,会发生问题当内部调用getContentResolver()。notifyChange导致同步循环时,提供程序触发网络同步。

当客户端应用程序进行修改时,需要使用网络同步标志的notifyChange,但在同步适配器正在修改时应该避免。

如何在一个contentprovider内轻松地判断客户端应用程序(应该在修改时会触发网络同步)还是由同步适配器(不应触发网络同步)使用它。

目前,我正在使用不同的CONTENT_URI(同步适配器使用CONTENT_URI_NO_SYNC访问数据,使用CONTENT_URI访问客户端应用程序)能够区分这两种访问类型并相应地设置网络同步标志。

回答

34

关于SyncAdapter的REST API使用的手表this video s。

他们讨论的方法是向数据库添加一组元数据标志列。这允许我们做3件事。

  1. 标志本身允许SyncAdapter确定需要更改的行以及这些更改的内容。你如何区分本地创建的行和本地修改的行之间的区别?此外,您如何知道要调用哪个REST API?如果你只是连续删除,你的SyncAdapter如何知道要删除的行如果数据现在没有了?相反,设置“应该删除”标志,然后,当SyncAdapter运行时,它知道将删除推送到服务器。

  2. 的标志让你CursorAdapter修改所创建的视图(如添加一个Spinner表明,“该行正在同步”)

  3. 最后,这他们点出,这些标志允许您说明行被修改的原因。如果没有设置任何标志并且该行发生更改,则必须已由于来自服务器的更新。因此,不需要同步到网络。

所以,这两个工作流程如下:

局部变化

  1. 应用程序创建新行。行“创建”标志是真实的。
  2. ContentProvider的存储行,看到创建标志,所以它调用notifyChange(...,true);
  3. 同步到网络=真(最后一个参数)导致SyncAdapter火。
  4. SyncAdapter扫描数据库,找到具有创建标志设置的行并执行相应的服务器操作。成功后,SyncAdapter清除标志。(行更新ContentProvivder
  5. ContentProvider看到标志清除,没有标志设置,因此它调用notifyChange(...,false);
  6. ContentObserver看看国旗变化,更新,看起来像“同步完成”

所有这些步骤都是等效更新/删除 - 每个可同步行的一个标志都可以创建/更新/删除的。 另请注意另一个赢 - 如果“创建”临时失败怎么办?服务器关闭...你怎么知道要重试? - 很简单,您不清除“创建”标志,并在15分钟后看到它。

远程更改

  1. SyncAdapter火灾是由于周期性同步。
  2. SyncAdapter从服务器获取更新。将更改推送到数据库中。不设置任何标志。 ContentProvider看到缺少标志,知道变化必须来自服务器(或不是需要推送到服务器的数据库更改),所以它调用notifyChange(...,false);
  3. ContentObserver s看到内容更改,所以它们用新的行数据更新
+0

很好的答案!现在一切都清楚了,谢谢! – m1h4

+2

+1关于Google I/O对话有很多评论,但很少有人倾向于使用选项C.感谢您清楚地总结。 –

+1

根据标志设置syncToNetwork是我的缺失链接。好的解决方案 –