CALLER_IS_SYNCADAPTER不一定會影響存儲在數據庫行中的內容,它取決於執行的命令。它不應該對查詢產生影響。請勿在設備上的用戶應用程序中使用它。
現在...它爲什麼會存在?
它是爲了幫助有有NotifyChange()/ ContentObservers/ContentResolver的/ Syncadapter整合。有兩種用於更改數據庫中的行的用例。
- 本地用戶從應用程序中編輯。
- 的變化來自於網絡(通過SyncAdapter)
要麼改變需要UI更新,如果它的屏幕上。因此ContentResolver.notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork)
被調用。這會更新ContentObservers並告訴他們從ContentProvider數據庫中獲取最新的數據。通話中的最後一個參數是您的線索。
ContentResolver的本身就是一個ContentObserver。當它看到數據庫更改時,它會考慮啓動SyncAdapter以將更改推送到網絡。在情況1中這很好。在情況2中,它是多餘的。從網絡中更改了,沒有任何理由啓動同步以發回更改。
Calendar.CALLER_IS_SYNCADAPTER是由SyncAdapter執行的update()中使用的一個提示。如果確實如此,則ContentProvider將syncToNetwork
設置爲false,確保不執行冗餘的第二次同步
第二個示例與提到的veljko一樣。從服務器刪除一件事最簡潔的方法是設置刪除標誌,然後執行同步。當CALLER_IS_SYNCADAPTER標誌爲false(用戶應用程序)時,對delete()的調用將設置該標誌。當標誌爲真(正在發生同步)時,對delete()的調用會將刪除操作推送到服務器,並從本地數據庫中刪除該行。只有一個delete()調用,該標誌允許ContentProvider知道它應該執行哪個任務。
非常感謝您的回覆。清潔消除! – Alx