为 Android 移动应用启用脱机同步

概述

本教程介绍适用于 Android 的 Azure 移动应用的脱机同步功能。 脱机同步允许最终用户与移动应用交互(查看、添加或修改数据),即使没有网络连接也是如此。 更改存储在本地数据库中。 设备重新联机后,这些更改会与远程后端同步。

如果这是 Azure 移动应用的第一次体验,则应首先完成教程 “创建 Android 应用”。 如果不使用下载的快速入门服务器项目,则必须将数据访问扩展包添加到项目中。 有关服务器扩展包的详细信息,请参阅 使用适用于 Azure 移动应用的 .NET 后端服务器 SDK

若要了解有关脱机同步功能的详细信息,请参阅主题 Azure 移动应用中的脱机数据同步

更新应用以支持脱机同步

使用脱机同步,可以从 同步表 (使用 IMobileServiceSyncTable 接口)读取和写入,该接口是设备上的 SQLite 数据库的一部分。

若要在设备和 Azure 移动服务之间推送和拉取更改,请使用 同步上下文MobileServiceClient.SyncContext),该上下文使用本地数据库进行初始化以在本地存储数据。

  1. TodoActivity.java 中,注释掉 mToDoTable 的现有定义,并取消注释同步表版本:

     private MobileServiceSyncTable<ToDoItem> mToDoTable;
    
  2. onCreate方法中,注释掉现有的mToDoTable初始化,并取消注释此定义:

     mToDoTable = mClient.getSyncTable("ToDoItem", ToDoItem.class);
    
  3. refreshItemsFromTable 中注释掉 results 的定义,并取消注释此定义:

     // Offline Sync
     final List<ToDoItem> results = refreshItemsFromMobileServiceTableSyncTable();
    
  4. 请将 refreshItemsFromMobileServiceTable 的定义注释掉。

  5. 取消注释refreshItemsFromMobileServiceTableSyncTable的定义。

     private List<ToDoItem> refreshItemsFromMobileServiceTableSyncTable() throws ExecutionException, InterruptedException {
         //sync the data
         sync().get();
         Query query = QueryOperations.field("complete").
                 eq(val(false));
         return mToDoTable.read(query).get();
     }
    
  6. 取消对 sync 定义的注释:

     private AsyncTask<Void, Void, Void> sync() {
         AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>(){
             @Override
             protected Void doInBackground(Void... params) {
                 try {
                     MobileServiceSyncContext syncContext = mClient.getSyncContext();
                     syncContext.push().get();
                     mToDoTable.pull(null).get();
                 } catch (final Exception e) {
                     createAndShowDialogFromTask(e, "Error");
                 }
                 return null;
             }
         };
         return runAsyncTask(task);
     }
    

测试应用

在本部分中,测试在 WiFi 打开的情况下的行为,然后关闭 WiFi 以创建离线场景。

添加数据项时,它们会保存在本地 SQLite 存储中,但在按 “刷新 ”按钮之前不会同步到移动服务。 其他应用可能对何时需要同步数据有不同的要求,但为了演示目的,本教程让用户明确提出同步请求。

按下该按钮时,将启动新的后台任务。 它首先使用同步上下文推送对本地存储所做的所有更改,然后将所有已更改的数据从 Azure 拉取到本地表。

离线测试

  1. 将设备或模拟器置于 飞行模式。 这会创建脱机场景。

  2. 添加一些 ToDo 项,或将某些项标记为已完成。 退出设备或模拟器(或强行关闭应用)并重启。 验证更改是否已保留在设备上,因为它们保存在本地 SQLite 存储中。

  3. 使用 SQL 工具(如 SQL Server Management Studio)或 REST 客户端(如 FiddlerPostman)查看 Azure TodoItem 表的内容。 验证新项目是否同步到服务器

    + For a Node.js backend, go to the [Azure portal](https://portal.azure.com/), and in your Mobile App backend click **Easy Tables** > **TodoItem** to view the contents of the `TodoItem` table.
    + For a .NET backend, view the table contents either with a SQL tool such as *SQL Server Management Studio*, or a REST client such as *Fiddler* or *Postman*.
    
  4. 在设备或模拟器中打开 WiFi。 接下来,按 “刷新 ”按钮。

  5. 在 Azure 门户中再次查看 TodoItem 数据。 此时会显示新的和已更改的 TodoItems。

其他资源