如何正确使用CALLER_IS_SYNCADAPTER

时间:2011-08-06 22:53:33

标签: android android-syncadapter

我不知道查询参数CALLER_IS_SYNCADAPTER的工作概念。其默认值为false,如果设置,则不会自动设置DIRTY标志。那它究竟意味着什么呢?根据我的理解,联系人的每次更改都会导致将脏标志设置为1.在同步适配器完成作业后,使用插入/更新/删除CALLER_IS_SYNCADAPTER,插入/更新和删除的记录的脏标志应为0 ,是吗?

但是,如果我使用该可选参数调用查询,则条目将保留为标志1.

我还有别的事要做,还是我理解它应该如何运作?或者有什么东西告诉系统成功完成同步以设置标志吗?

是否有人有进一步阅读的样本或建议?

3 个答案:

答案 0 :(得分:7)

CALLER_IS_SYNCADAPTER不一定会影响数据库行中存储的内容,它取决于执行的命令。它不应该对查询产生影响。请勿在设备上的用户应用程序中使用它。

现在......它为什么存在?

它用于帮助notifyChange()/ ContentObservers / ContentResolver / Syncadapter集成。有两种用例可以更改数据库中的行。

  1. 本地用户从应用程序进行编辑。
  2. 更改来自网络(通过SyncAdapter)
  3. 任何更改都需要更新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查询参数来完成电话端删除。