Xamarin Android モバイル アプリのオフライン同期を有効にするEnable offline sync for your Xamarin.Android mobile app

注意

Visual Studio App Center は、モバイル アプリ開発の中心となるエンドツーエンドの統合サービスをサポートしています。Visual Studio App Center supports end to end and integrated services central to mobile app development. 開発者は、ビルドテスト配布のサービスを使用して、継続的インテグレーションおよびデリバリー パイプラインを設定できます。Developers can use Build, Test and Distribute services to set up Continuous Integration and Delivery pipeline. アプリがデプロイされたら、開発者は分析および診断のサービスを利用してアプリの状態と使用状況を監視し、プッシュ サービスを利用してユーザーと関わることができます。Once the app is deployed, developers can monitor the status and usage of their app using the Analytics and Diagnostics services, and engage with users using the Push service. また、開発者は Auth を利用してユーザーを認証し、データ サービスを利用してクラウド内のアプリ データを保持および同期することもできます。Developers can also leverage Auth to authenticate their users and Data service to persist and sync app data in the cloud.

モバイル アプリケーションにクラウド サービスを統合することを検討している場合は、今すぐ App Center にサインアップしてください。If you are looking to integrate cloud services in your mobile application, sign up with App Center today.

概要Overview

このチュートリアルでは、Xamarin.Android 向けのAzure Mobile Apps のオフライン同期機能について説明します。This tutorial introduces the offline sync feature of Azure Mobile Apps for Xamarin.Android. オフライン同期を使用すると、エンド ユーザーはネットワークにアクセスできなくても、データの表示、追加、変更など、モバイル アプリケーションとやり取りできます。Offline sync allows end users to interact with a mobile app--viewing, adding, or modifying data--even when there is no network connection. 変更は、ローカル データベースに格納されます。Changes are stored in a local database. デバイスが再びオンラインになると、これらの変更がリモート サービスと同期されます。Once the device is back online, these changes are synced with the remote service.

このチュートリアルでは、「Create a Xamarin Android app (Xamarin Android アプリの作成)」チュートリアルからクライアント プロジェクトを更新し、Azure Mobile Apps のオフライン機能をサポートできるようにします。In this tutorial, you update the client project from the tutorial Create a Xamarin Android app to support the offline features of Azure Mobile Apps. ダウンロードしたクイック スタートのサーバー プロジェクトを使用しない場合は、データ アクセス拡張機能パッケージをプロジェクトに追加する必要があります。If you do not use the downloaded quick start server project, you must add the data access extension packages to your project. サーバーの拡張機能パッケージの詳細については、「 Work with the .NET backend server SDK for Azure Mobile Apps (Azure Mobile Apps 用の .NET バックエンド サーバー SDK を操作する)」を参照してください。For more information about server extension packages, see Work with the .NET backend server SDK for Azure Mobile Apps.

オフラインの同期機能の詳細については、トピック「 Azure Mobile Apps でのオフライン データ同期」をご覧ください。To learn more about the offline sync feature, see the topic Offline Data Sync in Azure Mobile Apps.

オフライン機能をサポートするようにクライアント アプリを更新するUpdate the client app to support offline features

Azure モバイル アプリのオフライン機能を使用すると、オフラインになっている状況でも、ローカル データベースとやり取りすることができます。Azure Mobile App offline features allow you to interact with a local database when you are in an offline scenario. アプリケーションでこれらの機能を使用するには、SyncContext をローカル ストアに初期化します。To use these features in your app, you initialize a SyncContext to a local store. 次に、IMobileServiceSyncTable インターフェイスを使用してテーブルを参照します。Then reference your table through the IMobileServiceSyncTable interface. SQLite は、デバイス上のローカル ストアとして使用されます。SQLite is used as the local store on the device.

  1. Visual Studio で、「Create a Xamarin Android app (Xamarin Android アプリの作成)」チュートリアルで完了したプロジェクトの NuGet パッケージ マネージャーを開きます。In Visual Studio, open the NuGet package manager in the project that you completed in the Create a Xamarin Android app tutorial. Microsoft.Azure.Mobile.Client.SQLiteStore NuGet パッケージを検索してインストールします。Search for and install the Microsoft.Azure.Mobile.Client.SQLiteStore NuGet package.
  2. ToDoActivity.cs ファイルを開き、#define OFFLINE_SYNC_ENABLED の定義をコメント解除します。Open the ToDoActivity.cs file and uncomment the #define OFFLINE_SYNC_ENABLED definition.
  3. Visual Studio で、 F5 キーを押してクライアント アプリをリビルドして実行します。In Visual Studio, press the F5 key to rebuild and run the client app. アプリは、オフライン同期を有効にする前と同じように動作します。ただし今度は、オフライン シナリオで使用できるデータがローカル データベースに格納されます。The app works the same as it did before you enabled offline sync. However, the local database is now populated with data that can be used in an offline scenario.

アプリを更新してバックエンドから切断するUpdate the app to disconnect from the backend

ここでは、オフライン状況をシミュレートするために、モバイル アプリ バックエンドへの接続を解除します。In this section, you break the connection to your Mobile App backend to simulate an offline situation. データ項目を追加すると、例外ハンドラーによって、アプリがオフライン モードであることが通知されます。When you add data items, your exception handler tells you that the app is in offline mode. この状態では、新しい項目はローカル ストアに追加され、プッシュが接続状態で実行されたときに、モバイル アプリ バックエンドに同期されます。In this state, new items added in the local store and are synced to the mobile app backend when a push is executed in a connected state.

  1. 共有プロジェクトの ToDoActivity.cs を編集します。Edit ToDoActivity.cs in the shared project. applicationURL を、無効な URL を指すように変更します。Change the applicationURL to point to an invalid URL:

      const string applicationURL = @"https://your-service.azurewebsites.fail";
    

    また、デバイス上で Wi-Fi および移動体通信ネットワークを無効にするか、機内モードを使用して、オフライン動作をデモンストレーションすることもできます。You can also demonstrate offline behavior by disabling wifi and cellular networks on the device or using airplane mode.

  2. F5 キーを押し、アプリケーションをビルドして実行します。Press F5 to build and run the app. アプリを起動した際の更新時には同期が失敗することに注意してください。Notice your sync failed on refresh when the app launched.

  3. 新しい項目を入力し、 [保存] をクリックするたびに [CancelledByNetworkError] ステータスでプッシュが失敗することを確認します。Enter new items and notice that push fails with a [CancelledByNetworkError] status each time you click Save. ただし、新しい todo 項目は、モバイル アプリ バックエンドにプッシュされるまでは、ローカル ストア内に存在します。However, the new todo items exist in the local store until they can be pushed to the mobile app backend. 運用アプリでは、これらの例外を抑制した場合、クライアント アプリはモバイル アプリ バックエンドにまだ接続されているかのように動作します。In a production app, if you suppress these exceptions the client app behaves as if it's still connected to the mobile app backend.

  4. アプリケーションを終了し、再起動して、作成した新しい項目がローカル ストアに保存されていることを確認します。Close the app and restart it to verify that the new items you created are persisted to the local store.

  5. (省略可能) Visual Studio で、 サーバー エクスプローラーを開きます。(Optional) In Visual Studio, open Server Explorer. [Azure] -> [SQL Databases] を選択して、データベースに移動します。Navigate to your database in Azure->SQL Databases. データベースを右クリックし、 [SQL Server オブジェクト エクスプローラーで開く] を選択します。Right-click your database and select Open in SQL Server Object Explorer. これで SQL データベースのテーブルとその内容を参照できます。Now you can browse to your SQL database table and its contents. バックエンド データベース内のデータが変更されていないことを確認します。Verify that the data in the backend database has not changed.

  6. (省略可能) Fiddler や Postman などの REST ツールを使用して、モバイルのバックエンドをクエリします。その際、https://<your-mobile-app-backend-name>.azurewebsites.net/tables/TodoItem の形式で、GET クエリを使用します。(Optional) Use a REST tool such as Fiddler or Postman to query your mobile backend, using a GET query in the form https://<your-mobile-app-backend-name>.azurewebsites.net/tables/TodoItem.

モバイル アプリ バックエンドに再接続するようにアプリケーションを更新するUpdate the app to reconnect your Mobile App backend

ここでは、アプリをモバイル アプリ バックエンドに再接続します。In this section, reconnect the app to the mobile app backend. 初めてアプリケーションを実行すると、OnCreate イベント ハンドラーが OnRefreshItemsSelected を呼び出します。When you first run the application, the OnCreate event handler calls OnRefreshItemsSelected. このメソッドが SyncAsync を呼び出し、ローカル ストアとバックエンドのデータベースを同期します。This method calls SyncAsync to sync your local store with the backend database.

  1. 共有プロジェクトの ToDoActivity.cs を開き、applicationURL プロパティの変更を元に戻します。Open ToDoActivity.cs in the shared project, and revert your change of the applicationURL property.

  2. F5 キーを押して、アプリケーションをリビルドして実行します。Press the F5 key to rebuild and run the app. アプリは、OnRefreshItemsSelected メソッドが実行されると、プッシュとプルの操作によって、ローカルでの変更を Azure Mobile Apps バックエンドに同期します。The app syncs your local changes with the Azure Mobile App backend using push and pull operations when the OnRefreshItemsSelected method executes.

  3. (省略可能) SQL Server Object Explorer または Fiddler などの REST ツールを使用して、更新データを表示します。(Optional) View the updated data using either SQL Server Object Explorer or a REST tool like Fiddler. データが同期されるのは、Azure モバイル アプリのバックエンドのデータベースとローカル ストアの間であることに注意してください。Notice the data has been synchronized between the Azure Mobile App backend database and the local store.

  4. アプリケーションで、ローカル ストアで完了させる項目の横にあるチェック ボックスをクリックします。In the app, click the check box beside a few items to complete them in the local store.

    CheckItemSyncAsync を呼び出し、完了した各項目をモバイル アプリ バックエンドと同期します。CheckItem calls SyncAsync to sync each completed item with the Mobile App backend. SyncAsync はプッシュとプルの両方を呼び出します。SyncAsync calls both push and pull. クライアントが変更したテーブルに対してプルを実行するたびに、プッシュが常に自動的に実行されますWhenever you execute a pull against a table that the client has made changes to, a push is always executed automatically. これは、ローカル ストアのすべてのテーブルとリレーションシップの一貫性を確実に保つためです。This ensures all tables in the local store along with relationships remain consistent. この動作によって、予期しないプッシュが行われることがあります。This behavior may result in an unexpected push. この動作については、「 Azure Mobile Apps でのオフライン データ同期」を参照してください。For more information on this behavior, see Offline Data Sync in Azure Mobile Apps.

クライアント同期コードの確認Review the client sync code

チュートリアル「 Create a Xamarin Android app (Xamarin Android アプリの作成) 」を完了した際にダウンロードした Xamarin クライアント プロジェクトには、ローカルの SQLite データベースを使用したオフライン同期をサポートするコードが既に含まれてます。The Xamarin client project that you downloaded when you completed the tutorial Create a Xamarin Android app already contains code supporting offline synchronization using a local SQLite database. チュートリアルのコードにすでに含まれているものの概要を示します。Here is a brief overview of what is already included in the tutorial code. 機能の概念的な概要については、「 Azure Mobile Apps でのオフライン データ同期」をご覧ください。For a conceptual overview of the feature, see Offline Data Sync in Azure Mobile Apps.

  • テーブル操作を実行する前に、ローカル ストアを初期化する必要があります。Before any table operations can be performed, the local store must be initialized. ToDoActivity.OnCreate()ToDoActivity.InitLocalStoreAsync() を実行すると、ローカル ストアのデータベースが初期化されます。The local store database is initialized when ToDoActivity.OnCreate() executes ToDoActivity.InitLocalStoreAsync(). このメソッドにより、Azure Mobile Apps クライアント SDK で提供される MobileServiceSQLiteStore クラスを使用して、ローカルの SQLite データベースが作成されます。This method creates a local SQLite database using the MobileServiceSQLiteStore class provided by the Azure Mobile Apps client SDK.

    DefineTable メソッドを実行すると、提供された型のフィールドに一致するテーブルがローカル ストアに作成されます。この例では、ToDoItem になります。The DefineTable method creates a table in the local store that matches the fields in the provided type, ToDoItem in this case. この型に、リモート データベース内のすべての列を含める必要はありません。The type doesn't have to include all the columns that are in the remote database. 列のサブセットのみ格納できます。It is possible to store just a subset of columns.

      // ToDoActivity.cs
      private async Task InitLocalStoreAsync()
      {
          // new code to initialize the SQLite store
          string path = Path.Combine(System.Environment
              .GetFolderPath(System.Environment.SpecialFolder.Personal), localDbFilename);
    
          if (!File.Exists(path))
          {
              File.Create(path).Dispose();
          }
    
          var store = new MobileServiceSQLiteStore(path);
          store.DefineTable<ToDoItem>();
    
          // Uses the default conflict handler, which fails on conflict
          // To use a different conflict handler, pass a parameter to InitializeAsync.
          // For more details, see https://go.microsoft.com/fwlink/?LinkId=521416.
          await client.SyncContext.InitializeAsync(store);
      }
    
  • ToDoActivitytoDoTable メンバーは、IMobileServiceTable ではなく、IMobileServiceSyncTable 型です。The toDoTable member of ToDoActivity is of the IMobileServiceSyncTable type instead of IMobileServiceTable. IMobileServiceSyncTable は、テーブルの作成、読み取り、更新、削除 (CRUD) などのすべての操作がローカル ストア データベースに対して行われるようにします。The IMobileServiceSyncTable directs all create, read, update, and delete (CRUD) table operations to the local store database.

    IMobileServiceSyncContext.PushAsync()を呼び出すことによって、変更がいつ Azure モバイル アプリ バックエンドにプッシュされるかを決定します。You decide when changes are pushed to the Azure Mobile App backend by calling IMobileServiceSyncContext.PushAsync(). 同期コンテキストは、 PushAsync が呼び出されたときに、クライアント アプリが変更を行ったすべてのテーブルで、変更を追跡およびプッシュすることで、テーブルの関係を保持するのに役立ちます。The sync context helps preserve table relationships by tracking and pushing changes in all tables a client app has modified when PushAsync is called.

    todoitem リストの更新、または todoitem の追加や完了があれば、提供されているコードは ToDoActivity.SyncAsync() を呼び出して同期します。The provided code calls ToDoActivity.SyncAsync() to sync whenever the todoitem list is refreshed or a todoitem is added or completed. コードは、ローカルの変更があるたびに同期されます。The code syncs after every local change.

    提供されたコードでは、リモートの TodoItem テーブルのすべてのレコードはクエリされますが、クエリ ID やクエリを PushAsync に渡すことでレコードをフィルター処理することも可能です。In the provided code, all records in the remote TodoItem table are queried, but it is also possible to filter records by passing a query id and query to PushAsync. 詳細については、「 Azure Mobile Apps でのオフライン データ同期 」の「 Azure Mobile Apps でのオフライン データ同期」セクションを参照してください。For more information, see the section Incremental Sync in Offline Data Sync in Azure Mobile Apps.

      // ToDoActivity.cs
      private async Task SyncAsync()
      {
          try {
              await client.SyncContext.PushAsync();
              await toDoTable.PullAsync("allTodoItems", toDoTable.CreateQuery()); // query ID is used for incremental sync
          } catch (Java.Net.MalformedURLException) {
              CreateAndShowDialog (new Exception ("There was an error creating the Mobile Service. Verify the URL"), "Error");
          } catch (Exception e) {
              CreateAndShowDialog (e, "Error");
          }
      }
    

その他のリソースAdditional Resources