APP下载

基于Dotm im.Sync框架的And roid移动数据同步方法及应用*

2020-06-18周千明朱欣娟解建仓

计算机与数字工程 2020年4期
关键词:服务器端离线客户端

周千明朱欣娟解建仓

(1.西安工程大学计算机科学学院 西安 710048)(2.西安理工大学省部共建西北旱区生态水利国家重点实验室 西安 710048)

1 引言

随着移动通信与互联网技术的迅速发展,运行在移动智能设备的各类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平台的移动终端为例,探索一种高效实用的移动数据同步方法。

2 Dotm im.Sync框架简介

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服务器完成服务器端与客户端数据库的同步操作。

3 处理流程

本文提出的基于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的访问。

4 关键技术及实现

4.1 创建基于REST风格的Web API

考虑到.NET Core框架整合了ASP.NETMVC与ASP.NETWeb API,具备明显的跨平台优势,因此采用。NETCoreWeb API架构创建基于REST风格的Web API。核心步骤如下:

Step 1在服务配置方法中注册同步提供程序:

services.AddSyncServer(connectionString,configuration=>{configuration.Add(new string[]{“Table”});});//connectionString为SQLServer数据库的连接字符串,Table表示需要同步的数据表。

Step 2创建数据同步控制器,采用依赖注入的方式注入服务器端Web代理提供程序:

private WebProxyServerProvider webProxy;//定义服务器端Web代理类型成员变量

public SyncController(WebProxyServerProvider proxy){webProxy=proxy};//在构造方法中初始化webProxy,SyncController为控制器名称。

Step 3在控制器的POST方法中调用HandleRequestAsync方法,执行异步请求,完成数据同步功能:

awaitwebProxyServer.HandleRequestAsync(this.HttpContext);//参数为请求上下文对象。

4.2 基于Xamarin.Android的移动终端APP实现

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对象,执行数据同步任务

4.3 数据同步方向与冲突问题解决

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,则服务器端获胜,将服务器端的变化数据强制应用到客户端的数据库中,反之则客户端获胜,将客户端的变化数据强制应用到服务器端的数据库中。

5 系统应用

高校固定资产管理系统是当前高校智慧校园平台建设的重要组成部分,而固定资产巡检子系统建设是其重点内容。由于受校园地理结构、建筑布局等因素影响,在固定资产巡检过程中,往往需要面对网络不可及或网络信号差的实际环境。因此,对离线环境的支持是固定资产巡检子系统待解决的关键问题。基于本文提出的基于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 高校固定资产巡检系统体系结构

6 结语

移动计算环境具有复杂性、动态性、弱连接性以及通信延迟与带宽相对有限等特性,使得数据同步问题成为“在线+离线”混合模式移动智能应用的技术难点。本文依次为切入点,针对复杂环境下移动智能应用数据同步的实际需求,提出一种基于Dotmim.Sync框架的Android移动数据同步方法。将该方法应用到高校的固定资产巡检系统中,取得了较好的效果,实践表明本文提出的解决方案具有较强的可操作性与较高的应用推广价值。

猜你喜欢

服务器端离线客户端
你的手机安装了多少个客户端
“人民网+客户端”推出数据新闻
——稳就业、惠民生,“数”读十年成绩单
基于卷积神经网络的离线笔迹鉴别系统
新版Windows 10补丁离线安装更简单
虚拟专用网络访问保护机制研究
基于Qt的安全即时通讯软件服务器端设计
基于Qt的网络聊天软件服务器端设计
一种基于Java的IM即时通讯软件的设计与实现
好进难出 应对迅雷“口袋战”
基于C/S架构的嵌入式监控组态外设扩展机制研究与应用