首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Android ContentProvider中防止网络同步时出现网络同步环路

在Android ContentProvider中防止网络同步时出现网络同步环路
EN

Stack Overflow用户
提问于 2011-07-06 04:56:56
回答 1查看 3K关注 0票数 14

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

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

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-07 04:37:10

查看this video了解SyncAdapter中REST API的使用情况。

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

  1. 标志本身允许SyncAdapter确定需要更改的行以及这些更改是什么。如何区分本地创建的行和本地修改的行?此外,您如何知道要进行哪个REST API调用?如果只删除了一行,那么如果数据现在已经消失,SyncAdapter如何知道要删除的行呢?相反,设置“应当删除”标志,然后,当SyncAdapter运行时,它知道要将delete推送到服务器。
  2. 标志允许CursorAdapter修改创建的视图(就像添加一个Spinner来显示“此行正在被删除,但他们没有指出这一点,标志允许您指出该行被修改的原因”)。如果没有设置任何标志,并且行发生了更改,则这一定是因为服务器进行了更新。因此,无需同步到网络。

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

本地更改

  1. 应用程序创建新行。行"create“标志为true。网络存储行,看到create标志,因此它调用notifyChange(...,true);
  2. Sync to
  3. ContentProvider = true (最后一个参数)会触发SyncAdapter
  4. SyncAdapter扫描数据库,查找设置了create标志的行,并执行适当的服务器操作。成功后,更新将清除标志。( ContentProvivder)
  5. ContentProvider上的行更新看到标志被清除,没有任何标志被设置,因此它调用notifyChange(...,false);
  6. ContentObservers查看标志更改,SyncAdapter使其看起来像“同步完成”

所有这些步骤对于update / delete都是等效的--对于每个create/update/delete,每个syncable行一个标志。还要注意另一个成功之处--如果"Create“暂时失败了怎么办?服务器关闭...你怎么知道重试呢?--很简单,你没有清除"Create“标志,15分钟后你就会看到它。

远程更改

由于定期同步,会触发

  1. SyncAdapter
  2. SyncAdapter从服务器获取更新。将更改推送到数据库中。不设置任何标志。ContentProvider发现缺少标志,知道更改肯定来自服务器(或者不是需要推送到服务器的数据库更改),因此它调用notifyChange(...,false);
  3. ContentObservers查看内容更改,因此它们使用新行数据

进行更新

票数 34
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6588770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档