概述
本教程介绍适用于 Xamarin.iOS 的 Azure 移动应用的脱机同步功能。 脱机同步允许最终用户与移动应用进行交互-查看、添加或修改数据,即使没有网络连接也是如此。 更改存储在本地数据库中。 设备重新联机后,这些更改将与远程服务同步。
在本教程中,从 “创建 Xamarin iOS”应用更新 Xamarin.iOS 应用 项目以支持 Azure 移动应用的脱机功能。 如果不使用下载的快速入门服务器项目,则必须将数据访问扩展包添加到项目中。 有关服务器扩展包的详细信息,请参阅 使用适用于 Azure 移动应用的 .NET 后端服务器 SDK。
若要了解有关脱机同步功能的详细信息,请参阅主题 Azure 移动应用中的脱机数据同步。
更新客户端应用以支持脱机功能
Azure 移动应用脱机功能允许你在脱机方案中与本地数据库交互。 若要在应用中使用这些功能,请将 SyncContext 初始化为本地存储。 通过 [IMobileServiceSyncTable] 接口引用表。 SQLite 用作设备上的本地存储。
- 在 创建 Xamarin iOS 应用 教程中完成的项目中打开 NuGet 包管理器,然后搜索并安装 Microsoft.Azure.Mobile.Client.SQLiteStore NuGet 包。
- 打开 QSTodoService.cs 文件并取消注释
#define OFFLINE_SYNC_ENABLED定义。 - 重新生成并运行客户端应用。 应用的工作方式与启用脱机同步之前的工作方式相同。但是,本地数据库现在填充了可在脱机方案中使用的数据。
更新应用以断开与后端的连接
在本部分中,将中断与移动应用后端的连接,以模拟脱机情况。 添加数据项时,异常处理程序会告知应用处于脱机模式。 在这种状态下,新增项会被添加到本地存储,并将在下次运行推送时在已连接状态下同步到移动应用的后端。
在共享项目中编辑QSToDoService.cs。 将 applicationURL 更改为指向无效 URL:
const string applicationURL = @"https://your-service.azurewebsites.fail";还可以通过在设备上禁用 wifi 和手机网络或使用飞行模式来演示脱机行为。
生成并运行应用。 请注意,应用启动后刷新时同步失败。
输入新项并注意到每次单击“ 保存”时推送失败并出现 [CancelledByNetworkError] 状态。 但是,新的待办事项存在于应用的本地存储中,直到可以同步到移动应用后端。 在生产应用中,如果取消这些异常,客户端应用的行为就像它仍然连接到移动应用后端一样。
关闭应用并重启它,以验证你创建的新项是否持久保存到本地存储中。
(可选)如果在电脑上安装了 Visual Studio,请打开 服务器资源管理器。 导航到您的 Azure SQL 数据库 ->。 右键单击您的数据库,然后选择“在 SQL Server 对象资源管理器 中打开”。 现在可以浏览到 SQL 数据库表及其内容。 验证后端数据库中的数据没有改变。
(可选)使用 REST 工具(如 Fiddler 或 Postman)通过表单
https://<your-mobile-app-backend-name>.azurewebsites.net/tables/TodoItem中的 GET 查询来查询移动后端。
更新应用以重新连接移动应用后端
在本部分中,将应用重新连接到移动应用后端。 这将模拟应用与移动应用后端从脱机状态切换到在线状态。 如果通过关闭网络连接来模拟网络中断,则无需更改代码。
再次打开网络。 首次运行应用程序时,将调用RefreshDataAsync 方法。 这反过来又调用 SyncAsync 将本地存储与后端数据库同步。
在共享项目中打开QSToDoService.cs,并还原 applicationURL 属性的更改。
重新生成并运行应用。 当
OnRefreshItemsSelected方法执行时,应用程序使用推送和拉取操作将本地修改与 Azure 移动应用后端同步。(可选)使用 SQL Server 对象资源管理器或 REST 工具(如 Fiddler)查看更新的数据。 请注意,数据已在 Azure 移动应用后端数据库和本地存储之间同步。
在应用中,点击几个项目旁边的复选框,以便在当地商店完成这些操作。
CompleteItemAsync调用SyncAsync以将每个已完成的项与移动应用后端同步。SyncAsync同时调用推送和拉取功能。 每当对客户端已更改的表进行拉取操作时,系统会自动首先在客户端同步上下文上执行推送操作。 隐式推送可确保本地存储中的所有表以及关系保持一致。 有关此行为的详细信息,请参阅 Azure 移动应用中的脱机数据同步。
查看客户端同步代码
完成教程 “创建 Xamarin iOS”应用 时下载的 Xamarin 客户端项目已包含使用本地 SQLite 数据库支持脱机同步的代码。 下面简要概述了教程代码中已包含的内容。 有关该功能的概念性概述,请参阅 Azure 移动应用中的脱机数据同步。
在执行任何表操作之前,必须初始化本地存储。 本地商店数据库在
QSTodoListViewController.ViewDidLoad()执行QSTodoService.InitializeStoreAsync()时初始化。 此方法使用MobileServiceSQLiteStoreAzure 移动应用客户端 SDK 提供的类创建新的本地 SQLite 数据库。此方法
DefineTable在本地存储中创建一个表,该表与所提供的类型中的字段匹配,ToDoItem在本例中。 该类型不必包括远程数据库中的所有列。 可以只存储列的子集。// QSTodoService.cs public async Task InitializeStoreAsync() { var store = new MobileServiceSQLiteStore(localDbPath); store.DefineTable<ToDoItem>(); // Uses the default conflict handler, which fails on conflict await client.SyncContext.InitializeAsync(store); }todoTable的成员QSTodoService是IMobileServiceSyncTable类型,而不是IMobileServiceTable。 IMobileServiceSyncTable 将所有创建、读取、更新和删除(CRUD)表操作指向本地存储数据库。通过调用
IMobileServiceSyncContext.PushAsync()确定何时将这些更改推送到 Azure 移动应用后端。 同步上下文通过跟踪和推送客户端应用在调用PushAsync时修改的所有表中的更改来帮助保留表关系。每当刷新 todoitem 列表或添加或完成 todoitem 时,提供的代码将调用
QSTodoService.SyncAsync()同步。 应用程序在每次本地更改后同步。 如果对包含上下文跟踪挂起的本地更新的表执行拉取操作,该操作将首先自动触发一次上下文推送。在提供的代码中,查询远程
TodoItem表中的所有记录,但也可以通过将查询 ID 和查询传递给PushAsync来筛选记录。 有关详细信息,请参阅 Azure 移动应用中的 脱机数据同步中的 增量同步 部分。// QSTodoService.cs public async Task SyncAsync() { try { await client.SyncContext.PushAsync(); await todoTable.PullAsync("allTodoItems", todoTable.CreateQuery()); // query ID is used for incremental sync } catch (MobileServiceInvalidOperationException e) { Console.Error.WriteLine(@"Sync Failed: {0}", e.Message); } }
其他资源
- 在 Azure 移动应用 中 脱机数据同步
- Azure 移动应用 .NET SDK HOWTO