3

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

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

我还有其他事情要做,还是我理解它应该如何工作?或者有什么东西可以告诉系统同步已成功完成以设置标志?

有人有样本或一些建议以供进一步阅读吗?

4

3 回答 3

7

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

现在……它为什么存在?

提供它是为了帮助 notifyChange() / ContentObservers / ContentResolver / Syncadapter 集成。更改数据库中的行有两个用例。

  1. 来自应用程序的本地用户编辑。
  2. 更改来自网络(通过 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为假,确保不执行冗余的第二次同步

第二个例子是 veljko 提到的。从服务器删除事物的最简单方法是设置删除标志,然后执行同步。当 CALLER_IS_SYNCADAPTER 标志为假(用户应用程序)时,调用 delete() 设置标志。当标志为真(同步发生)时,对 delete() 的调用将删除推送到服务器并从本地数据库中删除该行。只有一个 delete() 调用,这个标志允许 ContentProvider 知道它应该执行哪个任务。

于 2011-12-01T15:04:16.180 回答
4

您可以添加到现有的 Uri:

myUri=calendarUri.buildUpon().appendQueryParameter(Calendar.CALLER_IS_SYNCADAPTER, "true").build();
于 2011-08-23T14:26:38.790 回答
-1

这是来自Javadoc:

/** * 一个可选的插入、更新或删除 URI 参数,允许调用者 * 指定它是一个同步适配器。默认值为假。如果为真 * 脏标志不会自动设置,并且“syncToNetwork”参数 * 在调用时设置为假 * {@link ContentResolver#notifyChange(android.net.Uri, android.database.ContentObserver, boolean)}。*/

.

resolver.delete(...) 的调用不会立即删除原始联系人行。相反,它会在原始联系人上设置 DELETED 标志,并从其聚合联系人中删除原始联系人。然后同步适配器从服务器中删除原始联系人,并通过再次调用 resolver.delete(...) 并传递 CALLER_IS_SYNCADAPTER 查询参数来完成手机端的删除。

于 2011-08-24T07:15:14.363 回答