共用方式為


將離線資料同步新增至您的 Windows (UWP) 應用程式

注意

此產品已淘汰。 如需使用 .NET 8 或更新版本的專案取代專案,請參閱 Community Toolkit Datasync 連結庫

本教學課程涵蓋適用於UWP快速入門應用程式的 Azure Mobile Apps 離線同步處理功能。 離線同步處理可讓使用者與行動應用程式互動—檢視、新增或修改數據,即使沒有網路連線也一起。 變更會儲存在本機資料庫中。 裝置重新上線后,這些變更會與遠端後端同步。

開始本教學課程之前,您應該已完成 UWP 快速入門教學課程,其中包括建立適當的後端服務。 我們也假設您已將驗證 新增至您的應用程式。 您可以在不進行驗證的情況下,將離線功能新增至您的應用程式。

更新應用程式以支援離線同步處理

在線上作業中,您會從 IRemoteTable<T>讀取和寫入 。 使用離線同步處理時,您可以改為從 IOfflineTable<T> 讀取和寫入。 IOfflineTable<T> 是由裝置上的 SQLite 資料庫所支援,並與後端資料庫同步處理。

新增必要的 NuGet 套件

在 Visual Studio 中:

  1. 以滑鼠右鍵按鍵按下 TodoApp 解決方案,然後選取 [[管理方案的 NuGet 套件...]

  2. 在新索引標籤中,選取 [流覽],然後在搜尋方塊中輸入 Microsoft.Datasync.Client

    在Visual Studio中新增離線 NuGet 的螢幕快照。

  3. 選取 Microsoft.Datasync.Client.SQLiteStore 套件。

  4. 在右側窗格中,選取所有客戶端專案(TodoAppService.NET6 專案除外)。

  5. 選擇 [[安裝]

  6. 出現提示時,接受許可協定。

更新遠端服務用戶端

開啟 TodoApp.Data 專案,並找出 RemoteTodoService.cs 類別(在 Services 目錄中)。 更新類別,如下所示:

  1. 將下列 using 語句新增至檔案頂端:

    using Microsoft.Datasync.Client.SQLiteStore;
    
  2. _table 的定義變更為 IOfflineTable<TodoItem>

    /// <summary>
    /// Reference to the table used for datasync operations.
    /// </summary>
    private IOfflineTable<TodoItem> _table = null;
    
  3. 新增屬性以儲存離線資料庫位置:

    /// <summary>
    /// The path to the offline database
    /// </summary>
    public string OfflineDb { get; set; }
    
  4. 更新 InitializeAsync 方法來定義離線資料庫:

    // Create the offline store definition
    var connectionString = new UriBuilder { Scheme = "file", Path = OfflineDb, Query = "?mode=rwc" }.Uri.ToString();
    var store = new OfflineSQLiteStore(connectionString);
    store.DefineTable<TodoItem>();
    var options = new DatasyncClientOptions
    {
        OfflineStore = store,
        HttpPipeline = new HttpMessageHandler[] { new LoggingHandler() }
    };
    
    // Create the datasync client.
    _client = TokenRequestor == null 
        ? new DatasyncClient(Constants.ServiceUri, options)
        : new DatasyncClient(Constants.ServiceUri, new GenericAuthenticationProvider(TokenRequestor), options);
    
    // Initialize the database
    await _client.InitializeOfflineStoreAsync();
    
    // Get a reference to the offline table.
    _table = _client.GetOfflineTable<TodoItem>();
    
    // Set _initialized to true to prevent duplication of locking.
    _initialized = true;
    
  5. 更新 RefreshItemsAsync() 以執行離線同步處理:

    /// <summary>
    /// Refreshes the TodoItems list manually.
    /// </summary>
    /// <returns>A task that completes when the refresh is done.</returns>
    public async Task RefreshItemsAsync()
    {
        await InitializeAsync();
    
        // First, push all the items in the table.
        await _table.PushItemsAsync();
    
        // Then, pull all the items in the table.
        await _table.PullItemsAsync();
    
        return;
    }
    

設定離線資料庫位置

TodoApp.UWP 專案中,編輯 App.xaml.cs 檔案。 變更 RemoteTodoService 的定義,如下所示:

TodoService = new RemoteTodoService(GetAuthenticationToken)
{
    OfflineDb = ApplicationData.Current.LocalCacheFolder.Path + "\\offline.db"
};

如果您尚未完成 驗證教學課程,則定義應該如下所示:

TodoService = new RemoteTodoService()
{
    OfflineDb = ApplicationData.Current.LocalCacheFolder.Path + "\\offline.db"
};

如果無法辨識 ApplicationData,您可能需要將下列內容新增至檔案頂端:

using Windows.Storage;

注意

通用 Windows 平臺會限制您可以在其中讀取和寫入數據。 您可以使用 ApplicationData.Current中的任何儲存資料夾。 如果您要確保資料可供使用,但無法備份至雲端,請使用 LocalCacheFolder

測試應用程式

在按下重新整理圖示之前,應用程式不會與後端同步處理。 若要測試:

  1. 開啟 Azure 入口網站

  2. 開啟包含快速入門資源的資源群組。

  3. 選取 quickstart 資料庫。

  4. 選擇 查詢編輯器 (預覽)

  5. 使用您為資料庫設定的相同認證登入 SQL Server 驗證。

    • 如有必要,系統會提示您允許存取您的IP位址。 選取連結以更新allowlist,然後按 [確定] 重試登入。
  6. 在查詢編輯器中,輸入 SELECT * FROM [dbo].[TodoItems]。 然後選取 [執行]。

將會顯示目前 TodoItems 的清單。

S Q L 查詢編輯器中結果的螢幕快照。

現在,透過您的應用程式進行一些變更。 不要按重新整理(尚未)。

在 Azure 入口網站中重複 SQL 語句,並確認尚未對資料庫中的數據進行任何變更。

選取應用程式上的 重新整理 圖示,以將佇列中的數據推送至後端服務。 您會看到 [輸出偵錯] 視窗中發生的 HTTP 交易。

在 Azure 入口網站中重複 SQL 語句,並確認您的變更已推送至遠端服務。

清除資源

除非您正在執行另一個快速入門教學課程,否則您現在可以刪除與後端服務相關聯的資源。

  1. 開啟 Azure 入口網站
  2. 選取包含快速入門資源的資源群組。
  3. 選擇 [[刪除資源群組]
  4. 請依照指示確認刪除。

您也可以使用 Azure CLI:

az group delete -g quickstart

如果您使用 Azure 開發人員 CLI 來部署資源,您可以改用 azd down 命令。

刪除需要幾分鐘的時間才能完成。

後續步驟