不知怎的,我不理解查询参数CALLER_IS_SYNCADAPTER的工作概念。它的默认值为 false,如果设置,则不会自动设置 DIRTY 标志。那么它到底意味着什么呢?根据我的理解,联系人的每次更改都会导致将脏标志设置为 1。同步适配器完成作业后,使用带有 CALLER_IS_SYNCADAPTER 的插入/更新/删除,插入/更新和删除的记录应将脏标志设置为 0 , 是对的吗?
但是,如果我使用该可选参数调用查询,则条目仍保留标志 1。
我还需要做其他事情吗,或者我对它应该如何工作的理解是否错误?或者有什么东西可以告诉系统同步已成功完成以设置标志?
有人有样本或一些进一步阅读的建议吗?
CALLER_IS_SYNCADAPTER 不一定影响数据库行中存储的内容,它取决于执行的命令。它不应该对查询产生影响。请勿从设备上的用户应用程序使用它。
现在...它为什么存在?
提供它是为了帮助notifyChange() / ContentObservers / ContentResolver / Syncadapter 集成。更改数据库中的行有两种用例。
- 本地用户从应用程序进行编辑。
- 更改来自网络(通过 SyncAdapter)
任一更改都需要更新 UI(如果屏幕上有 UI)。所以ContentResolver.notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork)
被叫。这会更新 ContentObservers 并告诉它们从 ContentProvider DB 中获取最新数据。调用中的最后一个参数就是您的线索。
ContentResolver本身就是一个ContentObserver。当它看到数据库更改时,它会考虑启动 SyncAdapter 将更改推送到网络。这在情况 1 中非常有用。在情况 2 中,它是多余的。改变来了from网络上,根本没有理由启动同步来发回更改。
Calendar.CALLER_IS_SYNCADAPTER 是 SyncAdapter 执行的 update() 中使用的提示。当它为 true 时,ContentProvider 设置syncToNetwork
设置为 false,确保不执行冗余的第二次同步
第二个例子是 veljko 提到的。从服务器删除事物的最简洁方法是设置删除标志,然后执行同步。当 CALLER_IS_SYNCADAPTER 标志为 false(用户应用程序)时,对 delete() 的调用会设置该标志。当该标志为 true(正在发生同步)时,对 delete() 的调用会将删除内容推送到服务器并从本地数据库中删除该行。只有一个delete() 调用,该标志允许ContentProvider 知道它应该执行哪一项任务。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)