在Android ContentProvider中从网络同步时防止网络同步循环

m1h*_*1h4 14 java android android-contentprovider android-syncadapter

我正在编写自己的ContentProvider,它将使用SyncAdapter同步到Web服务.

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

客户端应用程序执行修改时需要带有网络同步标志的notifyChange,但在同步适配器修改时应避免使用.

如何在内容提供者内部轻松判断客户端应用程序(应该在修改时触发网络同步)或同步适配器(不应触发网络同步)使用它.

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

jcw*_*ger 34

观看有关s中REST API用法的视频SyncAdapter.

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

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

  2. 标志允许您CursorAdapter修改创建的视图(比如添加一个Spinner以显示"此行正在同步")

  3. 最后,他们没有指出,标志允许您告诉为什么行被修改.如果没有设置任何标志并且行发生更改,则必须是因为服务器的更新.因此,无需同步到网络.

因此,这两个工作流程如下:

地方变化

  1. 应用程序创建新行.行"创建"标志为真.
  2. ContentProvider存储行,看到create标志,因此它调用 notifyChange(...,true);
  3. 同步到network = true(最终参数)会导致SyncAdapter触发.
  4. SyncAdapter扫描数据库,找到设置了create flag的行并执行适当的服务器操作.成功后,SyncAdapter清除标志.(行更新ContentProvivder)
  5. ContentProvider 看到标志清楚,没有设置标志,所以它调用notifyChange(...,false);
  6. ContentObservers看到标志更改,更新看起来像"同步完成"

所有这些步骤都等同于更新/删除 - 每个create/update/delete的每个可同步行一个标志.还要注意另一个胜利 - 如果"创建"暂时失败怎么办?服务器下来...你怎么知道重试? - 简单,你不清除"创建"标志,你会在15分钟后看到它.

远程变更

  1. SyncAdapter 由于周期性同步而触发.
  2. SyncAdapter从服务器获取更新.将更改推送到数据库中.不设置任何标志. ContentProvider看到缺少标志,知道变更必须来自服务器(或者不是需要推送到服务器的数据库更改),所以它调用notifyChange(...,false);
  3. ContentObservers看到内容更改,因此他们使用新的行数据进行更新

  • +1有很多关于Google I/O谈话的评论,但很少有人倾向于使用选项C.感谢您对其进行了清晰的总结. (2认同)