我不知道查询参数CALLER_IS_SYNCADAPTER的工作概念。其默认值为false,如果设置,则不会自动设置DIRTY标志。那它究竟意味着什么呢?根据我的理解,联系人的每次更改都会导致将脏标志设置为1.在同步适配器完成作业后,使用插入/更新/删除CALLER_IS_SYNCADAPTER,插入/更新和删除的记录的脏标志应为0 ,是吗?
但是,如果我使用该可选参数调用查询,则条目将保留为标志1.
我还有别的事要做,还是我理解它应该如何运作?或者有什么东西告诉系统成功完成同步以设置标志吗?
是否有人有进一步阅读的样本或建议?
答案 0 :(得分:7)
CALLER_IS_SYNCADAPTER不一定会影响数据库行中存储的内容,它取决于执行的命令。它不应该对查询产生影响。请勿在设备上的用户应用程序中使用它。
现在......它为什么存在?
它用于帮助notifyChange()/ ContentObservers / ContentResolver / Syncadapter集成。有两种用例可以更改数据库中的行。
任何更改都需要更新UI,如果它在屏幕上。因此ContentResolver.notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork)
被调用。这会更新ContentObservers并告诉他们从ContentProvider DB获取最新数据。通话中的最后一个参数是你的线索。
ContentResolver本身就是一个ContentObserver。当它看到数据库发生变化时,会考虑启动SyncAdapter以将更改推送到网络。在案例1中这很好。在案例2中,它是多余的。来自网络的发生了变化,根本没有理由启动同步来发回更改。
Calendar.CALLER_IS_SYNCADAPTER是SyncAdapter执行的update()中使用的提示。如果是,则ContentProvider将syncToNetwork
设置为false,确保不执行冗余的第二次同步
第二个例子是veljko提到的。从服务器删除事物的最简洁方法是设置删除标志,然后执行同步。当CALLER_IS_SYNCADAPTER标志为false(用户应用程序)时,对delete()的调用将设置标志。当标志为真(发生同步)时,对delete()的调用会将删除推送到服务器并从本地DB中删除该行。只有一个delete()调用,这个标志允许ContentProvider知道它应该做什么任务。
答案 1 :(得分:3)
您可以添加到现有的Uri:
myUri=calendarUri.buildUpon().appendQueryParameter(Calendar.CALLER_IS_SYNCADAPTER, "true").build();
答案 2 :(得分:0)
来自Javadoc:
/ ** *允许调用者的可选插入,更新或删除URI参数 *指定它是同步适配器。默认值为false。如果是真的 *不会自动设置脏标志和“syncToNetwork”参数 *在呼叫时设置为false * {@link ContentResolver#notifyChange(android.net.Uri,android.database.ContentObserver,boolean)}。 * /
调用resolver.delete(...),不会立即删除原始联系人行。相反,它在原始联系人上设置DELETED标志,并从其聚合联系人中删除原始联系人。然后,同步适配器从服务器删除原始联系人,并通过再次调用resolver.delete(...)并传递CALLER_IS_SYNCADAPTER查询参数来完成电话端删除。