2011-08-06 386 views
3

不知何故,我不明白的查詢參數CALLER_IS_SYNCADAPTER的工作理念。其默認值爲假,如果設置,DIRTY標誌不會自動設置。那麼它實際上意味着什麼?根據我的理解,聯繫人的每次更改都會導致將髒標誌設置爲1.在同步適配器完成作業後,使用CALLER_IS_SYNCADAPTER執行插入/更新/刪除操作後,插入/更新和刪除的記錄應該有髒標誌0 , 是對的嗎?如何使用CALLER_IS_SYNCADAPTER正確

但是如果我調用查詢與可選參數,但條目保持與標誌1

有沒有別的東西,我需要做的,或者是我的理解它是如何應該工作錯了嗎?還是有什麼可以告訴系統同步已成功完成設置標誌?

沒有任何人有一個樣品或一些建議進一步閱讀?

回答

7

CALLER_IS_SYNCADAPTER不一定會影響存儲在數據庫行中的內容,它取決於執行的命令。它不應該對查詢產生影響。請勿在設備上的用戶應用程序中使用它。

現在...它爲什麼會存在?

它是爲了幫助有有NotifyChange()/ ContentObservers/ContentResolver的/ Syncadapter整合。有兩種用於更改數據庫中的行的用例。

  1. 本地用戶從應用程序中編輯。
  2. 的變化來自於網絡(通過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知道它應該執行哪個任務。

+0

非常感謝您的回覆。清潔消除! – Alx

2

您可以添加到現有的URI:

myUri=calendarUri.buildUpon().appendQueryParameter(Calendar.CALLER_IS_SYNCADAPTER, "true").build(); 
+0

嘿veljko,追加參數的作品,但我看不到它的有效性。數據庫中的參數設置爲true或false時有什麼不同? – Alx

0

下面是從的Javadoc:

/** * 一個可選的插入,更新或刪除URI參數允許調用 *指定它是一個同步適配器。默認值是false。如果爲真 *調用 * {@ ContentResolver#notifyChange(android.net.Uri,android.database.ContentObserver,boolean)}時,髒標誌不會自動設置並且「syncToNetwork」參數 *設置爲false。 */

resolver.delete(...)的調用不會立即刪除原始聯繫人行。相反,它會在原始聯繫人上設置DELETED標誌,並將原始聯繫人從其聯繫人中刪除。同步適配器然後從服務器刪除原始聯繫人並通過再次調用resolver.delete(...)並傳遞CALLER_IS_SYNCADAPTER查詢參數來完成電話端刪除操作。