我正在编写我自己的ContentProvider,它将使用SyncAdapter同步到web服务。
当同步适配器修改内容提供程序的数据时会发生问题。在内部调用getContentResolver().notifyChange时,提供程序会触发网络同步,从而导致同步循环。
当客户端应用程序进行修改时,需要具有网络同步标志的notifyChange,但是当同步适配器正在修改时,应该避免该a。
如何在contentprovider内部轻松判断它是由客户端应用程序使用(修改时应触发网络同步),还是由同步适配器使用(不应触发网络同步)。
目前,我使用不同的CONTENT_URI(同步适配器使用CONTENT_URI_NO_SYNC访问数据,客户端应用程序使用CONTENT_URI),以便能够区分这两种类型的访问,并相应地设置网络同步标志。
发布于 2011-07-07 04:37:10
查看this video了解SyncAdapter
中REST API的使用情况。
他们讨论的方法是向数据库添加一组元数据标志列。这让我们可以做3件事。
SyncAdapter
确定需要更改的行以及这些更改是什么。如何区分本地创建的行和本地修改的行?此外,您如何知道要进行哪个REST API调用?如果只删除了一行,那么如果数据现在已经消失,SyncAdapter
如何知道要删除的行呢?相反,设置“应当删除”标志,然后,当SyncAdapter
运行时,它知道要将delete推送到服务器。CursorAdapter
修改创建的视图(就像添加一个Spinner
来显示“此行正在被删除,但他们没有指出这一点,标志允许您指出该行被修改的原因”)。如果没有设置任何标志,并且行发生了更改,则这一定是因为服务器进行了更新。因此,无需同步到网络。因此,这两个工作流程如下:
本地更改
notifyChange(...,true);
SyncAdapter
。SyncAdapter
扫描数据库,查找设置了create标志的行,并执行适当的服务器操作。成功后,更新将清除标志。( ContentProvivder
)ContentProvider
上的行更新看到标志被清除,没有任何标志被设置,因此它调用notifyChange(...,false);ContentObserver
s查看标志更改,SyncAdapter
使其看起来像“同步完成”所有这些步骤对于update / delete都是等效的--对于每个create/update/delete,每个syncable行一个标志。还要注意另一个成功之处--如果"Create“暂时失败了怎么办?服务器关闭...你怎么知道重试呢?--很简单,你没有清除"Create“标志,15分钟后你就会看到它。
远程更改
由于定期同步,会触发
SyncAdapter
。SyncAdapter
从服务器获取更新。将更改推送到数据库中。不设置任何标志。ContentProvider
发现缺少标志,知道更改肯定来自服务器(或者不是需要推送到服务器的数据库更改),因此它调用notifyChange(...,false);
ContentObserver
s查看内容更改,因此它们使用新行数据进行更新
https://stackoverflow.com/questions/6588770
复制相似问题