移动智能应用可以分为在线模式、纯离线模式与“在线+离线”混合模式。在线模式下系统数据一般存储在服务器端的大中型数据库(如 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 表征客户端为所有冲突的获胜方