次の方法で共有


Windows アプリのオフライン同期を有効にする

概要

このチュートリアルでは、Azure Mobile App バックエンドを使用してユニバーサル Windows プラットフォーム (UWP) アプリにオフライン サポートを追加する方法について説明します。 オフライン同期を使用すると、エンド ユーザーは、ネットワーク接続がない場合でも、モバイル アプリの表示、追加、変更など、データを操作できます。 変更はローカル データベースに格納されます。 デバイスがオンラインに戻ると、これらの変更はリモート バックエンドと同期されます。

このチュートリアルでは、チュートリアル「Azure Mobile Apps のオフライン機能をサポートする Windows アプリを作成 する」から UWP アプリ プロジェクトを更新します。 ダウンロードしたクイック スタート サーバー プロジェクトを使用しない場合は、データ アクセス拡張機能パッケージをプロジェクトに追加する必要があります。 サーバー拡張機能パッケージの詳細については、「.NET バックエンド サーバー SDK for Azure Mobile Appsを使用する」を参照してください。

オフライン同期機能の詳細については、「Azure Mobile Apps でのオフライン データ同期」を参照してください。

必要条件

このチュートリアルでは、次の前提条件が必要です。

オフライン機能をサポートするようにクライアント アプリを更新する

Azure Mobile App のオフライン機能を使用すると、オフライン シナリオの場合にローカル データベースと対話できます。 アプリでこれらの機能を使用するには、 SyncContext をローカル ストアに初期化します。 次に、 IMobileServiceSyncTable インターフェイスを使用してテーブルを参照します。 SQLite は、デバイス上のローカル ストアとして使用されます。

  1. ユニバーサル Windows プラットフォーム用の SQLite ランタイムをインストールします

  2. Visual Studio で、「 Windows アプリの作成 」チュートリアルで完了した UWP アプリ プロジェクトの NuGet パッケージ マネージャーを開きます。 Microsoft.Azure.Mobile.Client.SQLiteStore NuGet パッケージを検索してインストールします。

  3. ソリューション エクスプローラーで、[参照]>[参照の追加]...> を右クリックします。ユニバーサル Windows>拡張機能を使用して、ユニバーサル Windows プラットフォーム用の SQLite とユニバーサル Windows プラットフォームアプリ用の Visual C++ 2015 ランタイムの両方を有効にします。

    SQLite UWP リファレンスの追加

  4. MainPage.xaml.cs ファイルを開き、 #define OFFLINE_SYNC_ENABLED 定義のコメントを解除します。

  5. Visual Studio で F5 キーを押して、クライアント アプリをリビルドして実行します。 このアプリは、オフライン同期を有効にする前と同じように動作します。ただし、オフライン シナリオで使用できるデータがローカル データベースに設定されるようになりました。

バックエンドから切断するようにアプリを更新する

このセクションでは、モバイル アプリ バックエンドへの接続を切断して、オフラインの状況をシミュレートします。 データ項目を追加すると、例外ハンドラーによって、アプリがオフライン モードであることが通知されます。 この状態では、新しい項目がローカル ストアに追加され、プッシュが次に接続状態で実行されるときにモバイル アプリ バックエンドに同期されます。

  1. 共有プロジェクトのApp.xaml.csを編集します。 MobileServiceClient の初期化をコメント アウトし、無効なモバイル アプリ URL を使用する次の行を追加します。

      public static MobileServiceClient MobileService = new MobileServiceClient("https://your-service.azurewebsites.fail");
    

    また、デバイス上の Wi-Fi ネットワークと携帯ネットワークを無効にするか、機内モードを使用してオフライン動作を示すこともできます。

  2. F5 キーを押してアプリをビルドして実行します。 アプリの起動時に更新時に同期が失敗したことを確認します。

  3. 新しい項目を入力し、[保存] をクリックするたびに CancelledByNetworkError 状態でプッシュが失敗することを確認 します。 ただし、モバイル アプリ バックエンドにプッシュできるようになるまで、新しい todo 項目はローカル ストアに存在します。 運用アプリでは、これらの例外を抑制すると、クライアント アプリはモバイル アプリ バックエンドにまだ接続されているかのように動作します。

  4. アプリを閉じて再起動し、作成した新しい項目がローカル ストアに保存されていることを確認します。

  5. (省略可能)Visual Studio で、 サーバー エクスプローラーを開きますAzure->SQL データベース内のデータベースに移動します。 データベースを右クリックし、[ SQL Server オブジェクト エクスプローラーで開く] を選択します。 これで、SQL データベーステーブルとその内容を参照できます。 バックエンド データベース内のデータが変更されていないことを確認します。

  6. (省略可能)Fiddler や Postman などの REST ツールを使用して、 https://<your-mobile-app-backend-name>.azurewebsites.net/tables/TodoItem形式の GET クエリを使用して、モバイル バックエンドにクエリを実行します。

モバイル アプリ バックエンドを再接続するようにアプリを更新する

このセクションでは、アプリをモバイル アプリ バックエンドに再接続します。 これらの変更は、アプリでのネットワーク再接続をシミュレートします。

アプリケーションを初めて実行すると、 OnNavigatedTo イベント ハンドラーによって InitLocalStoreAsyncが呼び出されます。 このメソッドは、 SyncAsync を呼び出して、ローカル ストアをバックエンド データベースと同期します。 アプリは起動時に同期を試みます。

  1. 共有プロジェクトでApp.xaml.csを開き、以前の MobileServiceClient の初期化のコメントを解除して、正しいモバイル アプリの URL を使用します。

  2. F5 キーを押して、アプリをリビルドして実行します。 アプリは、 OnNavigatedTo イベント ハンドラーの実行時にプッシュ操作とプル操作を使用して、ローカルの変更を Azure Mobile App バックエンドと同期します。

  3. (省略可能)SQL Server オブジェクト エクスプローラーまたは Fiddler などの REST ツールを使用して、更新されたデータを表示します。 Azure Mobile App バックエンド データベースとローカル ストアの間でデータが同期されていることに注意してください。

  4. アプリで、いくつかの項目の横にあるチェック ボックスをクリックして、ローカル ストアで完了します。

    UpdateCheckedTodoItemSyncAsync を呼び出して、完了した各項目をモバイル アプリ バックエンドと同期します。 SyncAsync はプッシュとプルの両方を呼び出します。 ただし、 クライアントが変更したテーブルに対してプルを実行するたびに、プッシュは常に自動的に実行されます。 この動作により、ローカル ストア内のすべてのテーブルとリレーションシップの一貫性が維持されます。 この動作により、予期しないプッシュが発生する可能性があります。 この動作の詳細については、「 Azure Mobile Apps でのオフライン データ同期」を参照してください。

API の概要

モバイル サービスのオフライン機能をサポートするために、 IMobileServiceSyncTable インターフェイスを使用し、ローカル SQLite データベースで MobileServiceClient.SyncContext を初期化しました。 オフラインの場合、Mobile Apps の通常の CRUD 操作は、ローカル ストアに対する操作の実行中にアプリがまだ接続されているかのように動作します。 ローカル ストアをサーバーと同期するには、次のメソッドを使用します。

  • PushAsync このメソッドは IMobileServicesSyncContext のメンバーであるため、すべてのテーブルの変更がバックエンドにプッシュされます。 ローカルの変更を含むレコードのみがサーバーに送信されます。
  • PullAsyncIMobileServiceSyncTable からプルが開始されます。 テーブルに変更が追跡されると、暗黙的なプッシュが実行され、ローカル ストア内のすべてのテーブルとリレーションシップの一貫性が維持されます。 pushOtherTables パラメーターは、コンテキスト内の他のテーブルを暗黙的なプッシュでプッシュするかどうかを制御します。 クエリ パラメーターは、IMobileServiceTableQuery<T> または OData クエリ文字列を受け取り、返されたデータをフィルター処理します。 queryId パラメーターは、増分同期を定義するために使用されます。詳細については、「Azure Mobile Apps でのオフライン データ同期」を参照してください。
  • PurgeAsync アプリでは、このメソッドを定期的に呼び出して、古いデータをローカル ストアから消去する必要があります。 まだ同期されていない変更を消去する必要がある場合は、 force パラメーターを使用します。

これらの概念の詳細については、「 Azure Mobile Apps でのオフライン データ同期」を参照してください。

詳細情報

次のトピックでは、Mobile Apps のオフライン同期機能に関するその他の背景情報について説明します。