- Android
- コルドバ
- iOS
- ウィンドウズ
- Xamarin.Android
- Xamarin.Forms
- Xamarin.iOS
概要
このチュートリアルでは、Xamarin.Android 用 Azure Mobile Apps のオフライン同期機能について説明します。 オフライン同期を使用すると、エンド ユーザーは、ネットワーク接続がない場合でも、モバイル アプリの表示、追加、変更など、データを操作できます。 変更はローカル データベースに格納されます。 デバイスがオンラインに戻ると、これらの変更はリモート サービスと同期されます。
このチュートリアルでは、チュートリアル「Azure Mobile Apps のオフライン機能をサポートする Xamarin Android アプリを作成 する」からクライアント プロジェクトを更新します。 ダウンロードしたクイック スタート サーバー プロジェクトを使用しない場合は、データ アクセス拡張機能パッケージをプロジェクトに追加する必要があります。 サーバー拡張機能パッケージの詳細については、「.NET バックエンド サーバー SDK for Azure Mobile Appsを使用する」を参照してください。
オフライン同期機能の詳細については、「Azure Mobile Apps でのオフライン データ同期」を参照してください。
オフライン機能をサポートするようにクライアント アプリを更新する
Azure Mobile App のオフライン機能を使用すると、オフライン シナリオの場合にローカル データベースと対話できます。 アプリでこれらの機能を使用するには、 SyncContext をローカル ストアに初期化します。 次に、 IMobileServiceSyncTable インターフェイスを使用してテーブルを参照します。 SQLite は、デバイス上のローカル ストアとして使用されます。
- Visual Studio で、「 Xamarin Android アプリの作成 」チュートリアルで完了したプロジェクトで NuGet パッケージ マネージャーを開きます。 Microsoft.Azure.Mobile.Client.SQLiteStore NuGet パッケージを検索してインストールします。
- ToDoActivity.cs ファイルを開き、
#define OFFLINE_SYNC_ENABLED
定義のコメントを解除します。 - Visual Studio で F5 キーを押して、クライアント アプリをリビルドして実行します。 このアプリは、オフライン同期を有効にする前と同じように動作します。ただし、オフライン シナリオで使用できるデータがローカル データベースに設定されるようになりました。
バックエンドから切断するようにアプリを更新する
このセクションでは、モバイル アプリ バックエンドへの接続を切断して、オフラインの状況をシミュレートします。 データ項目を追加すると、例外ハンドラーによって、アプリがオフライン モードであることが通知されます。 この状態では、新しい項目がローカル ストアに追加され、プッシュが接続状態で実行されるとモバイル アプリ バックエンドに同期されます。
共有プロジェクトのToDoActivity.csを編集します。 applicationURL を無効な URL を指すよう変更します。
const string applicationURL = @"https://your-service.azurewebsites.fail";
デバイスで Wi-Fi ネットワークと携帯ネットワークを無効にするか、機内モードを使用して、オフライン動作を示すこともできます。
F5 キーを押してアプリをビルドして実行します。 アプリの起動時に更新時に同期が失敗したことを確認します。
新しい項目を入力し、[保存] をクリックするたびに [CancelledByNetworkError] 状態でプッシュが失敗することを確認 します。 ただし、モバイル アプリ バックエンドにプッシュできるようになるまで、新しい todo 項目はローカル ストアに存在します。 運用アプリでは、これらの例外を抑制すると、クライアント アプリはモバイル アプリ バックエンドにまだ接続されているかのように動作します。
アプリを閉じて再起動し、作成した新しい項目がローカル ストアに保存されていることを確認します。
(省略可能)Visual Studio で、 サーバー エクスプローラーを開きます。 Azure->SQL データベース内のデータベースに移動します。 データベースを右クリックし、[ SQL Server オブジェクト エクスプローラーで開く] を選択します。 これで、SQL データベーステーブルとその内容を参照できます。 バックエンド データベース内のデータが変更されていないことを確認します。
(省略可能)Fiddler や Postman などの REST ツールを使用して、
https://<your-mobile-app-backend-name>.azurewebsites.net/tables/TodoItem
形式の GET クエリを使用して、モバイル バックエンドにクエリを実行します。
モバイル アプリ バックエンドを再接続するようにアプリを更新する
このセクションでは、アプリをモバイル アプリ バックエンドに再接続します。 アプリケーションを初めて実行すると、 OnCreate
イベント ハンドラーによって OnRefreshItemsSelected
が呼び出されます。 このメソッドは SyncAsync
を呼び出して、ローカル ストアをバックエンド データベースと同期します。
共有プロジェクトでToDoActivity.csを開き、 applicationURL プロパティの変更を元に戻します。
F5 キーを押して、アプリをリビルドして実行します。 アプリは、
OnRefreshItemsSelected
メソッドの実行時にプッシュ操作とプル操作を使用して、ローカルの変更を Azure Mobile App バックエンドと同期します。(省略可能)SQL Server オブジェクト エクスプローラーまたは Fiddler などの REST ツールを使用して、更新されたデータを表示します。 Azure Mobile App バックエンド データベースとローカル ストアの間でデータが同期されていることに注意してください。
アプリで、いくつかの項目の横にあるチェック ボックスをクリックして、ローカル ストアで完了します。
CheckItem
はSyncAsync
を呼び出して、完了した各項目をモバイル アプリ バックエンドと同期します。SyncAsync
はプッシュとプルの両方を呼び出します。 クライアントが変更したテーブルに対してプルを実行するたびに、プッシュは常に自動的に実行されます。 これにより、ローカル ストア内のすべてのテーブルとリレーションシップの一貫性が維持されます。 この動作により、予期しないプッシュが発生する可能性があります。 この動作の詳細については、「 Azure Mobile Apps でのオフライン データ同期」を参照してください。
クライアント同期コードを確認する
チュートリアル「 Xamarin Android アプリの作成 」を完了したときにダウンロードした Xamarin クライアント プロジェクトには、ローカル SQLite データベースを使用したオフライン同期をサポートするコードが既に含まれています。 チュートリアル コードに既に含まれている内容の簡単な概要を次に示します。 この機能の概念の概要については、「 Azure Mobile Apps でのオフライン データ同期」を参照してください。
テーブル操作を実行する前に、ローカル ストアを初期化する必要があります。 ローカル ストア データベースは、
ToDoActivity.OnCreate()
の実行時ToDoActivity.InitLocalStoreAsync()
初期化されます。 このメソッドは、Azure Mobile Apps クライアント SDK によって提供されるMobileServiceSQLiteStore
クラスを使用して、ローカル SQLite データベースを作成します。DefineTable
メソッドは、指定された型のフィールドと一致するテーブルをローカル ストアに作成します (この場合ToDoItem
)。 型には、リモート データベース内のすべての列を含める必要はありません。 列のサブセットのみを格納できます。// 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); }
toDoTable
のToDoActivity
メンバーは、IMobileServiceSyncTable
ではなくIMobileServiceTable
型です。 IMobileServiceSyncTable は、すべての作成、読み取り、更新、および削除 (CRUD) テーブル操作をローカル ストア データベースに転送します。変更が Azure Mobile App バックエンドにプッシュされるタイミングを決定するには、
IMobileServiceSyncContext.PushAsync()
を呼び出します。 同期コンテキストは、クライアント アプリが呼び出されたときにクライアント アプリが変更したすべてのテーブルの変更を追跡してプッシュすることで、テーブルのリレーションシップPushAsync
を保持するのに役立ちます。指定されたコードは、todoitem リストが更新されるか、todoitem が追加または完了するたびに同期する
ToDoActivity.SyncAsync()
を呼び出します。 コードは、ローカルの変更後に同期されます。指定されたコードでは、リモート
TodoItem
テーブル内のすべてのレコードがクエリされますが、クエリ ID とクエリをPushAsync
に渡すことでレコードをフィルター処理することもできます。 詳細については、「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"); } }
その他のリソース
- Azure Mobile Apps におけるオフラインデータ同期
- Azure Mobile Apps .NET SDK の使用方法