Xamarin.Android 모바일 앱에 대해 오프라인 동기화 사용Enable offline sync for your Xamarin.Android mobile app

참고

Visual Studio App Center는 모바일 앱 개발을 위한 중앙 새 및 통합 서비스에 투자 합니다.Visual Studio App Center is investing in new and integrated services central to mobile app development. 개발자가 사용할 수 빌드테스트 하 고 배포 연속 통합 및 배달 파이프라인을 설정 하는 서비스입니다.Developers can use Build, Test and Distribute services to set up Continuous Integration and Delivery pipeline. 개발자 상태 및 사용 하 여 해당 앱의 사용량을 모니터링할 수 있습니다, 앱을 배포한 후 합니다 Analytics 하 고 진단 , 서비스를 사용 하 여 사용자와 소통 하세요를 푸시 서비스입니다.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. 개발자가 활용할 수도 있습니다 인증 해당 사용자를 인증 하 고 데이터 유지 하 고 클라우드에 앱 데이터 동기화 서비스.Developers can also leverage Auth to authenticate their users and Data service to persist and sync app data in the cloud. 체크 아웃 App Center 지금 합니다.Check out 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.

이 자습서에서는 자습서 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. 서버 확장 패키지에 대한 자세한 내용은 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에서 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. 이 상태에서 로컬 저장소에 추가된 새 항목은 푸시가 연결된 상태에서 실행될 경우 Mobile App 백 엔드에 동기화됩니다.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. 잘못된 URL을 가리키도록 applicationURL을 변경합니다.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

이 섹션에서는 앱을 Mobile App 백 엔드에 다시 연결합니다.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 App 백 엔드와 동기화합니다.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 개체 탐색기 또는 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를 호출하여 Mobile App 백 엔드와 전체 항목을 동기화합니다.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

자습서 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 Mobile App 백 엔드로 푸시될 때를 결정합니다.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.

    제공되는 코드는 ToDoActivity.SyncAsync() 를 호출하여 todoitem목록이 새로 고쳐지거나 todoitem이 더해지거나 완료될 때마다 동기화합니다.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