移動智能應用可以分為在線模式、純離線模式與“在線+離線”混合模式。在線模式下系統數據一般存儲在服務器端的大中型數據庫(如 SQL Server、Oracle、MySQL 等),移動應用依賴于穩定可靠的網絡連接;純離線模式下系統數據一般存儲在移動終端的輕量級數據庫(如 SQLite等),移動應用不需要網絡連接;“在線+離線”混合模式則比較復雜,通常情況下系統數據存儲在服務器端,移動終端暫存部分數據,因而形成了分布式異構數據庫。在移動應用運行過程中,當移動終端或服務器端執行數據更新操作后,為了保證數據的完整性和一致性,需要進行雙向的數據同步。然而,由于移動網絡本身具有復雜性、動態性、弱連接性以及通信延遲與帶寬相對有限等特性,因而移動應用的數據同步技術備受考驗。
微軟高級軟件工程師 Sébastien Pertus 在 GitHub 網站開源了一種跨平臺的關系數據庫同步框架 Dotmim.Sync:https://github.com/Mimetis/Dotmim.Sync,該框架基于.NET Standard 2.0? 研發,支持在 IOT、 Xamarin、.NET、MAUI 等環境中使用。
文檔網站:?https://dotmimsync.readthedocs.io/?
Dotmim.Sync框架包含針對多種不同主流關系數據庫的子項目解決方案,每個子項目均發布為NuGet程序包,便于開發人員基于.NET平臺在項目中添加、移除與更新引用。Nuget 上一共發布了8個Nuget包:
其中 Dotmim.Sync.Core是核心的NuGet程序包,主要執行數據同步的核心邏輯。Dotmim.Sync.SqlServer、Dotmim.Sync.Sqlite、Dotmim.Sync.MySql、Dotmim.Sync.MariaDB 分別針對SQL Server、?SQLite、MySQL、MariaDB數據庫的?NuGet程序包,可以根據實際項目的數據庫部署需要,基于 .NET平臺在服務器端與客戶端程序中分別引用相應的NuGet程序包,進而完成服務器端與客戶端數據庫數據的同步。Dotmim.Sync.Web.Server 與?Dotmim.Sync.Web.Client NuGet程序包實現?HTTP協議通過Web服務器完成服務器端與客戶端數據庫的同步操作。
代碼倉庫里包含了豐富的示例程序,特別是IOT,MAUI,Xamarin 等在線+離線的場景 ,通常架構圖如下:
具備明顯的跨平臺優勢.NET Core ,因此采用.NET Core Web API架構創建基于REST風格的Web API。
核心步驟如下:
Step 1 在服務配置方法中注冊同步提供程序:
Step 2 創建數據同步控制器,采用依賴注入的方式注入服務器端Web 代理提供程序:
Step 3 在控制器的 POST 方法中調用 HandleRequestAsync 方法,執行異步請求,完成數據同步功能:
上述完成了服務端的設置,接下來就是設置客戶端。我們以MAUI 為例,基于MAUI 設計移動端應用,以Android 系統進行說明:
主要步驟如下:
Step 1 在項目的AndroidManifest.xml文件中添加網絡訪問、讀寫外部存儲等權限。
Step 2 由于Google 從Android P開始已經明確規定禁止http協議額,但是我們的接口都是http協議,從Nougat(Android 7)一個名為“Network Security Configuration”的新安全功能也隨之而來。網絡安全性配置特性讓應用可以在一個安全的聲明性配置文件中自定義其網絡安全設置,而無需修改應用代碼。
Step 3 在數據同步事件中,開啟子線程,在子線程中執行數據同步操作:
在數據同步過程中,有兩個問題是需要明確的,數據同步方向與沖突問題解決:
首先執行數據同步的常規過程,由客戶端發起數據同步 POST 請求,服務器端.NET Core Web API嘗試執行數據同步任務。其次,當檢測到數據沖突時,服務器端檢測預先設置的 ConflictResolutionPolicy 屬性值,如果其值為 Serverwins,則服務器端獲勝,將服務器端的變化數據強制應用到客戶端的數據庫中,反之則客戶端獲勝,將客戶端的變化數據強制應用到服務器端的數據庫中。
1)數據同步方向在 Dotmim.Sync 框架中,提供了用于表征數據同步方向的枚舉 SyncDirection。該枚舉包含 3 個值:Bidirectional(默認值)、DownloadOnly和 Upload?Only,分別對應“雙向同步”、“僅下載同步”與“僅上傳同步”3 種方向,可以具體為每個數據表SetupTable 分別設定同步方向。
2)通常情況下沖突問題解決Dotmim.Sync 框架采用 SyncOption 對象的配置策略屬性 ConflictResolutionPolicy解決數據沖突問題。
ConflictResolutionPolicy的可選項如下:
(1)?ConflictResolutionPolicy.Serverwins, 默認選項,表征服務端為所有沖突的獲勝方。
(2)?ConflictResolutionPolicy.Clientwins 表征客戶端為所有沖突的獲勝方