Android---解決雲端的數據衝突(一)

本文譯自:http://developer.android.com/training/cloudsave/conflict-res.html

本文介紹如何使用雲存儲服務爲應用程序的數據存儲設計強壯的衝突解決策略。該雲存儲服務允許你把應用程序的每個用戶的應用數據保存到Google的服務器上。通過使用雲存儲API,你的應用程序能夠獲取和更新來自Android設備、iOS設備、或Web應用的用戶數據。

把數據保存到雲存儲中,以及從其中裝載數據的處理是簡單的:它只是一個字節數組的系列化和反系列化的處理。但是當用戶有多個設備,有兩個以上的設備試圖把數據保存到雲端,這時存儲就可能發生衝突,因此你必須決定如何來解決它。你的雲端存儲數據的結構在很大程度上決定了解決這種衝突的能力,因此必須認真的設計你的數據,以便允許解決衝突的邏輯能夠正確的處理每種情況。

本文介紹了幾種有缺陷的方法,並解釋了它們的不足之處,然後提出了一個避免衝突的解決方案,該方案討論的重點在遊戲,但這些把數據保存到雲端的原則可以應用到任何應用程序。

獲取衝突通知

OnStateLoadedListener方法負責從Google的 服務中加載應用程序的狀態數據。OnStateLoadedListener.onStateConflict方法爲應用程序在用戶設備上的本地狀態與雲端的狀態之間提供了一種解決衝突的機制:

@Override
public
void onStateConflict(int stateKey, String resolvedVersion,
    byte[] localData, byte[] serverData) {
    // resolve conflict, thencall mAppStateClient.resolveConflict()
 ...
}

此時,你的應用程序必須選擇一個要保持的數據集,也可以提交一個新的被合併的數據集。這種解決衝突的邏輯需要你自己來實現。

要認識到的重要一點時,雲存儲服務是在後臺同步數據的。因此要確保你的應用程序能夠接收初始產生數據的上下文之外的回調。特別是如果Google Play服務程序在後臺檢測到一個衝突,那麼該回調會在下次試圖加載數據時被調用,這樣就有可能直到下次用戶啓動應用程序時調用纔會發生。

因此,雲存儲數據的設計和衝突解決的代碼必須是上下文無關的:給定兩個衝突數據的保存狀態,必須能夠只使用數據集內部的有效數據就能夠解決衝突,而不用關心任何外部環境。

處理簡單的情況

以下是一些簡單的衝突解決方法,對已大多數應用程序來說,使用下列策略之一就足以解決問題:

1. 新數據要優於舊數據:在某些場景中,新數據應該始終要替換舊數據。例如,如果數據代表了遊戲者所選擇的襯衫的顏色,那麼最近一次的選擇應該覆蓋以前的選擇。在這種情況中,你可能需要選擇在雲存儲的數據中保存時間戳。這樣在解決衝突時,選取最近一次的時間戳的數據就可以了(記住要使用可靠的時鐘,並要注意時區的差異)。

2. 一組數據集要優於其他數據:在有些場景中,總是要關注那些被定義爲“最好”的數據。例如,如果數據代表了遊戲者在競賽遊戲中表現最佳的時間,那麼在這種情況下,如果發生衝突,你就應該保持那個成績最好的時間。

3. 合併數據:通過計算兩個衝突的數據集的合集來解決衝突問題也是可能的。例如,如果你的數據代表了一組已經被遊戲者解鎖的遊戲等級,那麼解決的辦法就是簡單的把兩個衝突的數據集合併到一起就可以了。這種方法,遊戲者不會丟失任何已經被解鎖的遊戲等級。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章