離線資料同步

離線數據同步是 Azure Mobile Apps 的 SDK 功能。 數據會儲存在本地存儲中。 當您的應用程式離線時,您仍然可以建立、修改和搜尋數據。 當您的裝置上線時,數據會與您的 Azure Mobile Apps 服務同步處理。 當客戶端和服務上的相同記錄變更時,SDK 支援衝突解決。

離線同步處理有數個優點:

  • 改善應用程式回應性
  • 改善網路連線不良時的應用程式可靠性
  • 限制高延遲或計量付費網路上的網路使用
  • 支援中斷聯機的使用

下列教學課程示範如何使用 Azure Mobile Apps 將離線同步處理新增至行動用戶端:

什麼是同步數據表?

Azure Mobile Apps SDK 提供 IRemoteTable<T>,其會直接存取服務。 如果裝置沒有網路連線,作業就會失敗。 同步 處理數據表 (由 IOfflineTable<T>提供)針對本地存儲提供相同的作業。 然後,本地存儲可以稍後與服務同步處理。 執行任何作業之前,您必須先初始化本地存儲。

什麼是本地存儲?

本地存儲是用戶端裝置上的數據持續性層。 大部分的平台都會使用 SQLite 進行本地存儲,但 iOS 會使用核心數據。 您也可以實作自己的本地存儲。 例如,使用 SQLite 版本搭配 SQLCipher 來產生加密的存放區。

離線同步處理如何運作?

您的用戶端程式代碼會控制本機變更與數據同步服務何時同步。 在您推送本機變更之前,不會傳送任何專案給服務。 同樣地,只有在提取數據時,本地存儲才會填入新的或更新的數據。

您可以推送所有資料表的暫止作業、資料表清單或一個資料表:

// All tables
await client.PushTablesAsync();

// A list of tables
var tablesToPush = new string[] { "table1", "table2" };
await client.PushTablesAsync(tablesToPush);

// A single table
await table.PushItemsAsync();

同步處理

推送作業會將作業佇列中的所有暫止變更傳送至服務。 暫止變更會透過 HTTP REST 呼叫傳送至服務,進而修改您的資料庫。

推送作業會在任何提取作業之前完成。 提取作業會從服務提取已變更的數據,並將其儲存在本地存儲中。

隱含推送

如果您針對具有暫止本機更新的數據表執行提取,提取會先執行該數據表的推送。 此推送有助於將已排入佇列的變更與來自伺服器的新數據之間的衝突降到最低。 您可以在 選擇PullOptionsPushOtherTables性地設定所有資料表的推送:

var pullOptions = new PullOptions { PushOtherTables = true };
await table.PullItemsAsync(pullOptions);

提取記錄的子集

您可以選擇性地指定用來判斷哪些記錄應該包含在離線資料庫中的查詢。 例如:

var query = table.CreateQuery().Where(x => x.Color == "Blue");
await table.PullItemsAsync(query);

累加同步處理

Azure Mobile Apps 會實作累加同步處理。只會提取自上次提取作業之後變更的記錄。 累加同步處理可節省處理大型數據表的時間和頻寬。

對於每個唯一查詢, UpdatedAt 最後一筆成功傳輸記錄的欄位會儲存為離線存放區中的令牌。 最後一個 UpdatedAt 值會儲存在差異令牌存放區中。 差異令牌存放區會實作為離線存放區中的數據表。

效能和一致性

同步處理有時會過早停止。 例如:

  • 您用於同步處理的網路在同步處理過程中變得無法使用。
  • 您在同步處理期間強制關閉應用程式。

為了將脫機資料庫內一致性問題的風險降到最低,每個記錄都會在收到時寫入資料庫。 您可以選擇性地決定以批次方式將記錄寫入資料庫。 批次作業會增加提取作業期間離線資料庫寫入的效能。 不過,它們也會增加數據表元數據與數據表內數據不一致的風險。

您可以調整寫入之間的間隔,如下所示:

var pullOptions = new PullOptions { WriteDeltaTokenInterval = 25 };
await table.PullItemsAsync(pullOptions);

此程式代碼會收集寫入 25 筆記錄的批次。 效能測試建議效能可改善高達 25 的值。 WriteDeltaTokenInterval大於 25 的值不會大幅改善效能。

淨化

您可以使用 清除本地儲存 IOfflineTable<T>.PurgeItemsAsync的內容。 如果您在客戶端資料庫中有過時的數據,或如果您想要捨棄所有擱置中的變更,則可能需要清除。 清除會清除本地存儲中的數據表。 若要清除資料表:

await table.PurgeItemsAsync("", new PurgeOptions());

如果數據表中有暫止的變更,方法 PurgeItemsAsync()InvalidOperationException 擲回錯誤。 在此情況下,您可以強制清除:

await table.PurgeItemsAsync("", new PurgeOptions { DiscardPendingOperations = true });

清除是清除離線存放區中數據表的最後手段,因為它會抹除快取中的所有記錄,並要求您重新下載這些記錄。