CALLER_IS_SYNCADAPTER 不一定会影响存储在数据库行中的内容,它取决于执行的命令。它不应该对查询产生影响。不要从设备上的用户应用程序中使用它。
现在……它为什么存在?
提供它是为了帮助 notifyChange() / ContentObservers / ContentResolver / Syncadapter 集成。更改数据库中的行有两个用例。
- 来自应用程序的本地用户编辑。
- 更改来自网络(通过 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 知道它应该执行哪个任务。