啟用 Xamarin.Android 行動應用程式的離線同步處理
概觀
本教學課程介紹適用於 Xamarin.Android 的 Azure Mobile Apps 離機同步處理功能。 離線同步處理可讓使用者與行動裝置應用程式互動--檢視、新增或修改數據,即使沒有網路連線也是如此。 變更會儲存在本機資料庫中。 裝置重新上線后,這些變更會與遠端服務同步。
在本教學課程中,您會從教學課程 建立 Xamarin Android 應用程式 更新客戶端專案,以支援 Azure Mobile Apps 的離線功能。 如果您未使用下載的快速入門伺服器專案,您必須將資料存取延伸模組套件新增至專案。 如需有關伺服器擴充套件的更多資訊,請參閱 使用適用於 Azure 行動應用的 .NET 後台伺服器 SDK。
若要深入瞭解離線同步功能,請參閱在 Azure Mobile Apps 中 離線數據同步主題。
更新用戶端應用程式以支援離線功能
當您處於離線案例時,Azure 行動應用程式離線功能可讓您與本機資料庫互動。 若要在應用程式中使用這些功能,請將 syncContext 初始化為本地存儲。 然後透過 IMobileServiceSyncTable 介面來參考您的資料表。 SQLite 會當做裝置上的本地存儲使用。
- 在 Visual Studio 中,開啟您在 建立 Xamarin Android 應用程式 教學課程中完成之專案中的 NuGet 套件管理員。 搜尋並安裝 Microsoft.Azure.Mobile.Client.SQLiteStore NuGet 套件。
- 開啟ToDoActivity.cs檔案,並取消批注
#define OFFLINE_SYNC_ENABLED
定義。 - 在 Visual Studio 中,按 F5 鍵來重建並執行用戶端應用程式。 應用程式的運作方式與啟用離線同步處理之前的運作方式相同。不過,本機資料庫現在會填入可在離線案例中使用的數據。
更新應用程式以中斷與後端的連線
在本節中,您會中斷行動應用程式後端的連線,以模擬脫機情況。 當您新增數據項時,例外狀況處理程式會告訴您應用程式處於離線模式。 在此狀態下,本地存儲中新增的新專案會在推送以連線狀態執行時同步到行動應用程式後端。
編輯共享專案中ToDoActivity.cs。 將 applicationURL 變更為指向無效 URL:
const string applicationURL = @"https://your-service.azurewebsites.fail";
您也可以停用裝置上的 Wi-Fi 和行動網路或使用飛行模式來示範脫機行為。
按 F5 來建置並執行應用程式。 請注意,應用程式啟動時,您的同步在刷新時失敗。
輸入新的項目,並注意到每次您按下 [儲存]時,推送都會因 [CancelledByNetworkError] 狀態而失敗。 不過,新的待辦事項項目存在於本地存儲中,直到可以推送至行動應用程式後端為止。 在生產應用程式中,如果您隱藏這些例外狀況,用戶端應用程式的行為就如同它仍然連線到行動應用程式後端一樣。
關閉應用程式,然後重新啟動它,以確認您所建立的新專案會保存至本地存儲。
(選擇性)在 Visual Studio 中,開啟 [伺服器總管]。 瀏覽至 Azure 中的資料庫->SQL 資料庫。 以滑鼠右鍵按下您的資料庫,然後選取 [在 SQL Server 物件總管中開啟] 。 現在您可以瀏覽至 SQL 資料庫資料表及其內容。 確認後端資料庫中的數據尚未變更。
(選擇性)使用 Fiddler 或 Postman 等 REST 工具來查詢您的行動後端,並使用格式為
https://<your-mobile-app-backend-name>.azurewebsites.net/tables/TodoItem
的 GET 查詢。
更新應用程式以重新連線行動應用程式後端
在本節中,將應用程式重新連線到行動應用程式後端。 當您第一次執行應用程式時,OnCreate
事件處理程式會呼叫 OnRefreshItemsSelected
。 此方法會呼叫 SyncAsync
,以便將您的本地儲存與後端資料庫同步。
在共用項目中開啟ToDoActivity.cs,並還原 applicationURL 屬性的變更。
按 F5 鍵以重建並執行應用程式。 當
OnRefreshItemsSelected
方法執行時,應用程式會使用推送和提取作業,同步處理本機變更與 Azure 行動應用程式後端。(選擇性)使用 SQL Server 物件總管或 Fiddler 等 REST 工具檢視更新的數據。 注意,Azure 行動應用的後端的資料庫與本地儲存之間數據已同步。
在應用程式中,點擊幾個項目旁邊的複選框,以在當地商店完成這些項目。
CheckItem
呼叫SyncAsync
,以同步處理每個已完成的專案與行動應用程式後端。SyncAsync
調用 push 和 pull。 每當針對用戶端已變更的數據表執行提取時,一律會自動執行推送。 這可確保本地存儲中的所有數據表及其關聯性始終保持一致。 此行為可能會導致非預期的推動。 如需此行為的詳細資訊,請參閱在 Azure Mobile Apps 中離線數據同步。
檢閱用戶端同步程序代碼
當您完成本教學課程時所下載的 Xamarin 用戶端專案 建立 Xamarin Android 應用程式 已經包含使用本機 SQLite 資料庫支援離線同步處理的程式代碼。 以下是教學程式碼中已包含內容的簡短概覽。 如需此功能的概念概觀,請參閱 Azure Mobile Apps 中的離線數據同步。
必須先初始化本地存儲,才能執行任何數據表作業。
ToDoActivity.OnCreate()
執行ToDoActivity.InitLocalStoreAsync()
時,會初始化本地存儲資料庫。 這個方法會使用 Azure Mobile Apps 用戶端 SDK 所提供的MobileServiceSQLiteStore
類別,建立本機 SQLite 資料庫。DefineTable
方法會在本地儲存中建立一個資料表,以對應於所提供類型的欄位,在此案例中為ToDoItem
。 類型不一定包含遠端資料庫中的所有數據行。 可以只儲存數據行的子集。// ToDoActivity.cs private async Task InitLocalStoreAsync() { // new code to initialize the SQLite store string path = Path.Combine(System.Environment .GetFolderPath(System.Environment.SpecialFolder.Personal), localDbFilename); if (!File.Exists(path)) { File.Create(path).Dispose(); } var store = new MobileServiceSQLiteStore(path); store.DefineTable<ToDoItem>(); // Uses the default conflict handler, which fails on conflict // To use a different conflict handler, pass a parameter to InitializeAsync. // For more details, see https://go.microsoft.com/fwlink/?LinkId=521416. await client.SyncContext.InitializeAsync(store); }
toDoTable
的ToDoActivity
成員是IMobileServiceSyncTable
類型,而不是IMobileServiceTable
。 IMobileServiceSyncTable 會將所有建立、讀取、更新和刪除 (CRUD) 資料表作業導向至本地存儲資料庫。您可以呼叫
IMobileServiceSyncContext.PushAsync()
,決定何時將變更推送至 Azure 行動應用程式後端。 同步處理內容可追蹤和推送用戶端應用程式在呼叫PushAsync
時修改的所有資料表中變更,藉以協助保留數據表關聯性。所提供的程式代碼會呼叫
ToDoActivity.SyncAsync()
,以在重新整理 todoitem 清單或新增或完成 todoitem 時同步處理。 程式代碼會在每次本機變更後同步。在提供的程式代碼中,會查詢遠端
TodoItem
數據表中的所有記錄,但也可以藉由將查詢標識碼和查詢傳遞至PushAsync
來篩選記錄。 如需詳細資訊,請參閱 Azure Mobile Apps 的 脫機數據同步中的 增量同步 一節。// ToDoActivity.cs private async Task SyncAsync() { try { await client.SyncContext.PushAsync(); await toDoTable.PullAsync("allTodoItems", toDoTable.CreateQuery()); // query ID is used for incremental sync } catch (Java.Net.MalformedURLException) { CreateAndShowDialog (new Exception ("There was an error creating the Mobile Service. Verify the URL"), "Error"); } catch (Exception e) { CreateAndShowDialog (e, "Error"); } }
其他資源
- Azure Mobile Apps 中的 離線數據同步
- Azure Mobile Apps .NET SDK HOWTO