Azure Mobile Apps 中的離線數據同步
什麼是離線數據同步?
離線數據同步是 Azure Mobile Apps 的用戶端和伺服器 SDK 功能,可讓開發人員輕鬆地建立在沒有網路連線的情況下運作的應用程式。
當您的應用程式處於離線模式時,您仍然可以建立和修改儲存至本地儲存的數據。 當應用程式重新上線時,它可以將本機變更同步至 Azure 行動應用程式後端。 此功能也支援在用戶端和後端上變更相同記錄時偵測衝突。 接著可以在伺服器或客戶端上處理衝突。
離線同步處理有數個優點:
- 通過在裝置本機快取伺服器資料來改善應用程式的回應速度
- 建立健全的應用程式,在發生網路問題時仍然有用
- 允許使用者建立和修改數據,即使沒有網路存取權,也支援幾乎沒有連線或沒有連線能力的情況
- 同步處理多個裝置的數據,並在兩個裝置修改相同記錄時偵測衝突
- 限制高延遲或計量付費網路上的網路使用
下列教學課程示範如何使用 Azure Mobile Apps 將離線同步處理新增至行動用戶端:
- Android:啟用離線同步處理
- Apache Cordova:啟用離線同步處理
- iOS:啟用離線同步處理
- Xamarin iOS:啟用離線同步處理
- Xamarin Android:啟用離線同步處理
- Xamarin.Forms:啟用離線同步處理
- 通用 Windows 平臺:啟用離線同步處理
什麼是同步數據表?
若要存取「/數據表」連接點,Azure 行動用戶端 SDK 提供介面,例如 IMobileServiceTable
(.NET 用戶端 SDK) 或 MSTable
(iOS 用戶端)。 這些 API 會直接連線到 Azure 行動應用程式後端,如果用戶端裝置沒有網路連線,則失敗。
若要支援離線使用,您的應用程式應該改用 同步數據表 API,例如 IMobileServiceSyncTable
(.NET 用戶端 SDK) 或 MSSyncTable
(iOS 用戶端)。 所有相同的 CRUD 作業(建立、讀取、更新、刪除)都適用於同步資料表 API,但現在它們會從 本地存儲讀取或寫入。 必須先初始化本地存儲,才能執行任何同步數據表作業。
什麼是本地商店?
本地存儲是用戶端裝置上的數據持續性層。 Azure Mobile Apps 用戶端 SDK 提供預設的本地存儲實作。 在 Windows、Xamarin 和 Android 上,它是以 SQLite 為基礎。 在 iOS 上,它是以核心數據為基礎。
若要在 Windows Phone 或 Microsoft 市集上使用 SQLite 型實作,您需要安裝 SQLite 擴充功能。 如需詳細資訊,請參閱 通用 Windows 平臺:啟用離線同步處理。Android 和 iOS 隨附於裝置作系統本身的 SQLite 版本,因此不需要參考您自己的 SQLite 版本。
開發人員也可以實作自己的本地存儲。 例如,如果您想要將數據以加密格式儲存在行動用戶端上,您可以定義使用 SQLCipher 進行加密的本地存儲。
什麼是同步上下文?
同步上下文 與行動客戶端物件相關聯(例如 IMobileServiceClient
或 MSClient
),並追蹤同步表格中所做的更動。 同步處理內容會維護 作業佇列,它會保留稍後傳送至伺服器的 CUD 作業排序列表(建立、更新、刪除)。
本地商店會使用初始化方法與同步處理內容相關聯,例如 .NET 用戶端 SDK中的 IMobileServicesSyncContext.InitializeAsync(localstore)
。
離線同步處理的運作方式
使用同步處理數據表時,您的用戶端程式代碼會控制本機變更與 Azure 行動應用程式後端同步的時機。 直到呼叫 推送 本機變更時,才會將任何東西傳送至後端。 同樣地,只有在呼叫 提取 數據時,才會將本地存儲填入新的數據。
推送:推送是同步處理內容上的作業,並傳送自上次推送后的所有 CUD 變更。 請注意,無法只傳送單個表格的變更,因為這會導致操作順序錯亂。 推送會對您的 Azure 行動應用程式後端執行一系列 REST 呼叫,進而修改您的伺服器資料庫。
提取:提取是以每個數據表為基礎執行,而且可以使用查詢自定義,只擷取伺服器數據的子集。 然後,Azure 行動用戶端 SDK 會將產生的數據插入本地存儲。
隱含推送:如果拉取操作針對具有待處理的本機更新的資料表執行,拉取會先在同步內容上執行
push()
。 此推送有助於將已排入佇列的變更與來自伺服器的新數據之間的衝突降到最低。累加同步:提取作業的第一個參數是 查詢名稱,僅用於用戶端。 如果您使用非 Null 查詢名稱,Azure 行動 SDK 會執行 累加同步處理。每次提取作業傳回一組結果時,該結果集的最新
updatedAt
時間戳會儲存在 SDK 本機系統數據表中。 後續的提取作業只會擷取該時間戳之後的記錄。若要使用累加同步處理,您的伺服器必須傳回有意義的
updatedAt
值,而且也必須支援依此欄位排序。 不過,由於 SDK 會在 updatedAt 欄位上新增自己的排序,所以您無法使用具有自己orderBy
子句的提取查詢。查詢名稱可以是您選擇的任何字串,但應用程式中的每個邏輯查詢都必須是唯一的。 否則,不同的提取作業可能會覆寫相同的累加同步時間戳,而您的查詢可能會傳回不正確的結果。
如果查詢具有參數,則建立唯一查詢名稱的其中一種方式是併入參數值。 例如,如果您要篩選 userid,您的查詢名稱可能如下所示(在 C# 中):
await todoTable.PullAsync("todoItems" + userid, syncTable.Where(u => u.UserId == userid));
如果您想要退出增量同步,請傳遞
null
作為查詢 ID。 在此情況下,系統會在每次呼叫PullAsync
時擷取所有記錄,這可能效率不高。清除:您可以使用
IMobileServiceSyncTable.PurgeAsync
清除本地儲存的內容。 如果您在客戶端資料庫中有過時的數據,或如果您想要捨棄所有暫止的變更,則可能需要清除。清除會清除本地存儲中的表格。 如果有操作在等待與伺服器資料庫同步,除非已設定 強制清除 參數,否則清除操作將會拋出異常。
在用戶端上過時數據的範例中,假設在“todo list” 範例中,Device1 只會提取未完成的專案。 待辦事項「購買牛奶」已由另一部裝置在伺服器上標示為已完成。 不過,Device1 仍然在本地存儲中擁有「購買牛奶」待辦事項,因為它只會同步尚未標示為完成的事項。 清除會移除此陳舊的項目。