다음을 통해 공유


Xamarin.Android 모바일 앱에 대해 오프라인 동기화 사용

개요

이 자습서에서는 Xamarin.Android용 Azure Mobile Apps의 오프라인 동기화 기능을 소개합니다. 오프라인 동기화를 사용하면 최종 사용자가 네트워크 연결이 없는 경우에도 데이터를 보거나 추가하거나 수정하는 모바일 앱과 상호 작용할 수 있습니다. 변경 내용은 로컬 데이터베이스에 저장됩니다. 디바이스가 다시 온라인 상태가 되면 이러한 변경 내용이 원격 서비스와 동기화됩니다.

이 자습서에서는 Azure Mobile Apps의 오프라인 기능을 지원하기 위해 Xamarin Android 앱 만들기 자습서에서 클라이언트 프로젝트를 업데이트합니다. 다운로드한 빠른 시작 서버 프로젝트를 사용하지 않는 경우 프로젝트에 데이터 액세스 확장 패키지를 추가해야 합니다. 서버 확장 패키지에 대한 자세한 내용은 Azure Mobile Apps용 .NET 백 엔드 서버 SDK작업을 참조하세요.

오프라인 동기화 기능에 대한 자세한 내용은 Azure Mobile Apps 오프라인 데이터 동기화항목을 참조하세요.

오프라인 기능을 지원하도록 클라이언트 앱 업데이트

Azure Mobile App 오프라인 기능을 사용하면 오프라인 시나리오에서 로컬 데이터베이스와 상호 작용할 수 있습니다. 앱에서 이러한 기능을 사용하려면, SyncContext을 로컬 저장소에 초기화해야 합니다. 그런 다음 IMobileServiceSyncTable 인터페이스를 통해 테이블을 참조합니다. SQLite는 디바이스의 로컬 저장소로 사용됩니다.

  1. Visual Studio에서 Xamarin Android 앱 만들기 튜토리얼에서 작성한 프로젝트에서 NuGet 패키지 관리자를 열어보세요. Microsoft.Azure.Mobile.Client.SQLiteStore NuGet 패키지를 검색하고 설치합니다.
  2. ToDoActivity.cs 파일을 열고 #define OFFLINE_SYNC_ENABLED 정의의 주석 처리를 제거합니다.
  3. Visual Studio에서 F5 키를 눌러 클라이언트 앱을 다시 빌드하고 실행합니다. 앱은 오프라인 동기화를 사용하도록 설정하기 전과 동일하게 작동합니다. 그러나 로컬 데이터베이스는 이제 오프라인 시나리오에서 사용할 수 있는 데이터로 채워집니다.

백 엔드에서 연결을 끊도록 앱 업데이트

이 섹션에서는 모바일 앱 백 엔드에 대한 연결을 끊어 오프라인 상황을 시뮬레이션합니다. 데이터 항목을 추가하면 예외 처리기가 앱이 오프라인 모드임을 알려줍니다. 이 상태에서 로컬 저장소에 추가된 새 항목은 푸시가 연결된 상태에서 실행될 때 모바일 앱 백 엔드에 동기화됩니다.

  1. 공유 프로젝트에서 ToDoActivity.cs 편집합니다. 잘못된 URL을 가리키도록 applicationURL 변경합니다.

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

    디바이스에서 Wifi 및 셀룰러 네트워크를 사용하지 않도록 설정하거나 비행기 모드를 사용하여 오프라인 동작을 시연할 수도 있습니다.

  2. F5 눌러 앱을 빌드하고 실행합니다. 앱이 시작될 때 새로 고침 시 동기화가 실패했습니다.

  3. 새 항목을 입력하고 저장을 클릭할 때마다 [CancelledByNetworkError] 상태로 푸시가 실패하는 것을 확인하세요. 그러나 새 할 일 항목은 모바일 앱 백 엔드로 푸시할 수 있을 때까지 로컬 저장소에 존재합니다. 프로덕션 앱에서 이러한 예외를 표시하지 않으면 클라이언트 앱이 모바일 앱 백 엔드에 연결된 것처럼 동작합니다.

  4. 앱을 닫고 다시 시작하여 만든 새 항목이 로컬 저장소에 유지되는지 확인합니다.

  5. (선택 사항) Visual Studio에서 서버 탐색기엽니다. Azure ->내의데이터베이스로 이동합니다. 데이터베이스를 마우스 오른쪽 단추로 클릭하고 SQL Server 개체 탐색기 열기를 선택합니다. 이제 SQL 데이터베이스 테이블 및 해당 내용을 찾아볼 수 있습니다. 백 엔드 데이터베이스의 데이터가 변경되지 않은지 확인합니다.

  6. (선택 사항) Fiddler 또는 Postman과 같은 REST 도구를 사용하여 https://<your-mobile-app-backend-name>.azurewebsites.net/tables/TodoItem양식의 GET 쿼리를 사용하여 모바일 백 엔드를 쿼리합니다.

모바일 앱 백 엔드를 다시 연결하도록 앱 업데이트

이 섹션에서는 모바일 앱 백 엔드에 앱을 다시 연결합니다. 애플리케이션을 처음 실행하면 OnCreate 이벤트 처리기가 OnRefreshItemsSelected호출합니다. 이 메서드는 SyncAsync 호출하여 로컬 저장소를 백 엔드 데이터베이스와 동기화합니다.

  1. 공유 프로젝트에서 ToDoActivity.cs 열고 applicationURL 속성의 변경 내용을 되돌려 줍니다.

  2. F5 키를 눌러 앱을 다시 빌드하고 실행합니다. 앱은 OnRefreshItemsSelected 메서드가 실행되면 푸시 및 끌어오기 작업을 사용하여 로컬 변경 내용을 Azure Mobile App 백 엔드와 동기화합니다.

  3. (선택 사항) SQL Server 개체 탐색기 또는 Fiddler와 같은 REST 도구를 사용하여 업데이트된 데이터를 봅니다. 데이터가 Azure Mobile App 백 엔드 데이터베이스와 로컬 저장소 간에 동기화되었습니다.

  4. 앱에서 몇 가지 항목 옆에 있는 확인란을 클릭하여 로컬 저장소에서 완료합니다.

    CheckItem SyncAsync 호출하여 완료된 각 항목을 모바일 앱 백 엔드와 동기화합니다. SyncAsync 푸시 및 풀을 모두 호출합니다. 클라이언트가 변경한 테이블에 대해 끌어오기를 실행할 때마다 푸시가 항상 자동으로실행됩니다. 이렇게 하면 관계와 함께 로컬 저장소의 모든 테이블이 일관성을 유지합니다. 이 동작으로 인해 예기치 않은 푸시가 발생할 수 있습니다. 이 동작에 대한 자세한 내용은 Azure Mobile Apps 오프라인 데이터 동기화참조하세요.

클라이언트 동기화 코드 검토

자습서를 완료할 때 다운로드한 Xamarin 클라이언트 프로젝트 Xamarin Android 앱 만들기 로컬 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);
      }
    
  • ToDoActivitytoDoTable 멤버는 IMobileServiceTable대신 IMobileServiceSyncTable 종류입니다. IMobileServiceSyncTable은 모든 만들기, 읽기, 업데이트 및 삭제(CRUD) 테이블 작업을 로컬 저장소 데이터베이스로 전달합니다.

    IMobileServiceSyncContext.PushAsync()호출하여 변경 내용이 Azure Mobile App 백 엔드로 푸시되는 시기를 결정합니다. 동기화 컨텍스트는 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");
          }
      }
    

추가 리소스