周千明朱欣娟解建倉
(1.西安工程大學計算機科學學院 西安 710048)(2.西安理工大學省部共建西北旱區生態水利國家重點實驗室 西安 710048)
隨著移動通信與互聯網技術的迅速發展,運行在移動智能設備的各類APP大量涌現并應用到不同領域。從技術層面看,移動智能應用可以分為在線模式、純離線模式與“在線+離線”混合模式[1~2]。在線模式下系統數據一般存儲在服務器端的大中型數據庫(如SQL Server、Oracle、MySQL等),移動應用依賴于穩定可靠的網絡連接;純離線模式下系統數據一般存儲在移動終端的輕量級數據庫(如SQLite、Couchbase Lite、SQL Server CE等),移動應用不需要網絡連接;“在線+離線”混合模式則比較復雜,通常情況下系統數據存儲在服務器端,移動終端暫存部分數據,因而形成了分布式異構數據庫[3~4]。在移動應用運行過程中,當移動終端或服務器端執行數據更新操作后,為了保證數據的完整性和一致性,需要進行雙向的數據同步。然而,由于移動網絡本身具有復雜性、動態性、弱連接性以及通信延遲與帶寬相對有限等特性[5],因而移動應用的數據同步技術備受考驗。
在移動智能應用的大背景下,移動應用的數據同步逐漸成為熱點議題[6~8]。文獻[9]采用SDN技術建立移動數據同步機制,通過SDN的控制平面維護同步服務器的數據表。文獻[10]提出一種基于改進的消息摘要數據同步算法ISAMD,采用標準的SQL函數進行數據同步。這兩種移動數據同步策略的核心邏輯均依靠中間層的同步服務器完成,影響系統的部署成本和性能,難以滿足大多數移動應用的實際需求。文獻[11]與文獻[12]分別針對iOS與Windows移動平臺設計了相應的數據同步方案,缺點在于方案對平臺的可移植性有限。作為對以上移動數據同步方法的改進,微軟高級軟件工程師Sébastien Pertus在GitHub網站開源了一種跨平臺的關系數據庫同步框架Dotmim.Sync[13],該框架基于 微 軟.NET Standard 2.0[14]研 發,支 持 在IOT、Xamarin、.NET、UWP等環境中使用。基于此,本文重點依托Dotmim.Sync框架,以Android平臺的移動終端為例,探索一種高效實用的移動數據同步方法。
Dotmim.Sync框架包含針對多種不同主流關系數據庫的子項目解決方案,每個子項目均發布為NuGet程序包[15],便于開發人員基于.NET平臺在項目中添加、移除與更新引用。在GitHub網站上展示的最新Dotmim.Sync框架中,一共發布7個NuGet程序包,如圖1所示。

圖1 Dotmim.Sync發布的NuGet程序包
其中,Dotmim.Sync.Core為核心NuGet程序包,主要執行數據同步的核心邏輯。Dotmim.Sync.SqlServer、Dotmim.Sync.Sqlite、Dotmim.Sync.MySql、Dotmim.Sync.PostgreSql分別為針對SQL Server、SQLite、MySQL、PostgreSQL數據庫的NuGet程序包,可以根據實際項目的數據庫部署需要,基于.NET平臺在服務器端與客戶端程序中分別引用相應的NuGet程序包,進而完成服務器端與客戶端數據庫的數據同步。Dotmim.Sync.Web.Server與Dotmim.Sync.Web.Client NuGet程序包實現基于HTTP協議通過Web服務器完成服務器端與客戶端數據庫的同步操作。
本文提出的基于Dotmim.Sync框架的Android移動數據同步方法處理流程如圖2所示。

圖2 基于Dotmim.Sync框架的Android移動數據同步處理流程
在圖2中,采用雙向虛線連接的位于Android移動終端的SQLite與數據庫服務器SQL Server為最終需要進行數據同步的關鍵環節。首先,在服務器端創建.NETCoreWeb代理,調用Dotmim.Sync框架的Dotmim.Sync.SqlServer與Dotmim.Sync.Web.Server兩個NuGet程序包,面向客戶端提供基于REST風格的不同Web API(.NETCoreWeb API或.NETWeb API架構),實現數據交互的核心操作,數據交互格式采用輕量級的JSON格式。其次,.NET CoreWeb代理面向數據庫服務器端采用經典的ADO.NET技術訪問SQL Server。最后,在Android移動終端,Android APP采用SQLite.NET類庫完成對本地SQLite數據庫的CRUD基本操作。同時,需要調用Dotmim.Sync框架的Dotmim.Sync.Sqlite與Dotmim.Sync.Web.Client兩個NuGet程序包,實現對.NET CoreWeb代理提供的用于數據同步核心API的訪問。
考慮到.NET Core框架整合了ASP.NETMVC與ASP.NETWeb API,具備明顯的跨平臺優勢,因此采用。NETCoreWeb API架構創建基于REST風格的Web API。核心步驟如下:
Step 1在服務配置方法中注冊同步提供程序:
services.AddSyncServer
Step 2創建數據同步控制器,采用依賴注入的方式注入服務器端Web代理提供程序:
private WebProxyServerProvider webProxy;//定義服務器端Web代理類型成員變量
public SyncController(WebProxyServerProvider proxy){webProxy=proxy};//在構造方法中初始化webProxy,SyncController為控制器名稱。
Step 3在控制器的POST方法中調用HandleRequestAsync方法,執行異步請求,完成數據同步功能:
awaitwebProxyServer.HandleRequestAsync(this.HttpContext);//參數為請求上下文對象。
Xamarin.Android為.NET開發人員提供了完整的Android SDK,實現在Visual Studio IDE中利用C#創建完全本機的Android應用。基于此,為了有效利用Dotmim.Sync框架,基于Xamarin.Android設計與實現移動終端APP。主要步驟如下:
Step 1在項目的AndroidManifest.xm l文件中添加網絡訪問、讀寫外部存儲等權限。
Step 2由于Google從Android 6.0開始引入了危險權限動態申請授權機制,讀寫外部存儲被劃分到危險權限系列中,因此需要進行動態申請:
this.RequestPermissions(new string[]{Manifest.Permission.ReadExternal Storage,Manifest.Permission.WriteExternalStorage},1);//傳入的參數為申請的權限數組與請求碼
Step 3在數據同步事件中,開啟子線程,在子線程中執行數據同步操作:
var clientProvider= new SqliteSyncProvider(connString);//創建客戶端同步提供程序并實例化,其中connString為本地SQLite數據庫的路徑
var proxyClientProvider=new WebProxyClient-Provider(new Uri(“https://202.200.200.36/api/sync”));//創建客戶端代理并實例化,參數為.NET CoreWeb API的數據同步接口地址
await(new SyncAgent(clientProvider,proxyClientProvider)).SynchronizeAsync();//實例化SyncAgent對象,執行數據同步任務
1)數據同步方向
在Dotmim.Sync框架中,提供了用于表征數據同步方向的枚舉SyncDirection。該枚舉包含3個值:Bidirectional(默認值)、DownloadOnly與Upload-Only,分別對應“雙向同步”、“僅下載同步”與“僅上傳同步”3種方向,可以具體為每個數據表分別設定同步方向:
agent.SetConfiguration(c=>{//agent為SyncAgent對象
c[“Table1”].SyncDirection=SyncDirection.Bidirectional;//設置Table1雙向同步
c[“Table2”].SyncDirection=SyncDirection.DownloadOnly;//設置Table2僅下載同步});
2)沖突問題解決
通常情況下,Dotmim.Sync框架采用SyncConfiguration對象的配置策略屬性ConflictResolution-Policy解決數據沖突問題。ConflictResolutionPolicy的可選項如下:
(1)ConflictResolutionPolicy.Serverwins,默認選項,表征服務器端為所有沖突的獲勝方
(2)ConflictResolutionPolicy.Clientwins,表征客戶端為所有沖突的獲勝方
與設定數據同步方向類似,通過SyncAgent對象的SetConfiguration方法進行設置:
agent.SetConfiguration(c=>{c.ConflictResolutionPolicy=ConflictResolutionPolicy.
ClientW ins;});//設定客戶端為所有沖突的獲勝方
當數據同步過程中產生沖突問題時,由服務器端負責解決,具體流程如圖3所示。

圖3 數據沖突問題解決流程
在圖3所示流程中,首先執行數據同步的常規過程,由客戶端發起數據同步POST請求,服務器端.NETCoreWeb API嘗試執行數據同步任務。其次,當檢測到數據沖突時,服務器端檢測預先設置的ConflictResolutionPolicy屬性值,如果其值為Serverwins,則服務器端獲勝,將服務器端的變化數據強制應用到客戶端的數據庫中,反之則客戶端獲勝,將客戶端的變化數據強制應用到服務器端的數據庫中。
高校固定資產管理系統是當前高校智慧校園平臺建設的重要組成部分,而固定資產巡檢子系統建設是其重點內容。由于受校園地理結構、建筑布局等因素影響,在固定資產巡檢過程中,往往需要面對網絡不可及或網絡信號差的實際環境。因此,對離線環境的支持是固定資產巡檢子系統待解決的關鍵問題。基于本文提出的基于Dotmim.Sync框架的Android移動數據同步方法,采用Microsoft Visual Studio 2017集成開發環境,以Microsoft SQL Server 2014建立數據庫服務器,借助jQuery EasyUI界面插件技術、.NETCore框架與Xamarin.Android開發平臺研究與實現國內某高校的固定資產巡檢系統,系統體系結構圖4所示。
其中,系統的服務器端包括基于REST風格的.NET Core Web API與數據庫服務器,.NET Core Web API對外提供所有與資產巡檢相關的業務邏輯接口。系統從用戶使用的角度分為PC端與Android移動終端,二者均可以通過Internet訪問.NET CoreWeb API,不同之處在于PC端與Internet建立的連接是穩定可靠的,而Android移動終端在巡檢時不能確保對Internet的實時訪問。在系統運行過程中,高校資產部門領導從PC端登錄系統,下發巡檢任務。巡檢工作人員收到巡檢指令后,按照巡檢任務安排前往相應地點開展巡檢工作,采用Android移動終端的APP掃描預先粘貼在設備的二維碼,不需要關心現場的網絡環境,即可查看設備詳情及巡檢歷史記錄,并根據實際情況填寫與提交巡檢記錄。當網絡信號不可及或網絡信號差時,巡檢記錄保存在本地的SQLite數據庫中,等到系統檢測到穩定的網絡信號時,系統自動完成本地SQLite數據庫與服務器端SQL Server數據庫的雙向數據同步。目前,該系統運行穩定,提高了固定資產巡檢效率,進一步有效提升了學校信息化管理水平。

圖4 高校固定資產巡檢系統體系結構
移動計算環境具有復雜性、動態性、弱連接性以及通信延遲與帶寬相對有限等特性,使得數據同步問題成為“在線+離線”混合模式移動智能應用的技術難點。本文依次為切入點,針對復雜環境下移動智能應用數據同步的實際需求,提出一種基于Dotmim.Sync框架的Android移動數據同步方法。將該方法應用到高校的固定資產巡檢系統中,取得了較好的效果,實踐表明本文提出的解決方案具有較強的可操作性與較高的應用推廣價值。