개요
이 자습서에서는 Xamarin.Android용 Azure Mobile Apps의 오프라인 동기화 기능을 소개합니다. 오프라인 동기화를 사용하면 최종 사용자가 네트워크 연결이 없는 경우에도 데이터를 보거나 추가하거나 수정하는 모바일 앱과 상호 작용할 수 있습니다. 변경 내용은 로컬 데이터베이스에 저장됩니다. 디바이스가 다시 온라인 상태가 되면 이러한 변경 내용이 원격 서비스와 동기화됩니다.
이 자습서에서는 Azure Mobile Apps의 오프라인 기능을 지원하기 위해 Xamarin Android 앱 만들기 자습서에서 클라이언트 프로젝트를 업데이트합니다. 다운로드한 빠른 시작 서버 프로젝트를 사용하지 않는 경우 프로젝트에 데이터 액세스 확장 패키지를 추가해야 합니다. 서버 확장 패키지에 대한 자세한 내용은 Azure Mobile Apps용 .NET 백 엔드 서버 SDK작업을 참조하세요.
오프라인 동기화 기능에 대한 자세한 내용은 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 편집합니다. 잘못된 URL을 가리키도록 applicationURL 변경합니다.
const string applicationURL = @"https://your-service.azurewebsites.fail";
디바이스에서 Wifi 및 셀룰러 네트워크를 사용하지 않도록 설정하거나 비행기 모드를 사용하여 오프라인 동작을 시연할 수도 있습니다.
F5 눌러 앱을 빌드하고 실행합니다. 앱이 시작될 때 새로 고침 시 동기화가 실패했습니다.
새 항목을 입력하고 저장을 클릭할 때마다 [CancelledByNetworkError] 상태로 푸시가 실패하는 것을 확인하세요. 그러나 새 할 일 항목은 모바일 앱 백 엔드로 푸시할 수 있을 때까지 로컬 저장소에 존재합니다. 프로덕션 앱에서 이러한 예외를 표시하지 않으면 클라이언트 앱이 모바일 앱 백 엔드에 연결된 것처럼 동작합니다.
앱을 닫고 다시 시작하여 만든 새 항목이 로컬 저장소에 유지되는지 확인합니다.
(선택 사항) Visual Studio에서 서버 탐색기엽니다. Azure ->내의데이터베이스로 이동합니다. 데이터베이스를 마우스 오른쪽 단추로 클릭하고 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 클라이언트 프로젝트 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); }
ToDoActivity
의toDoTable
멤버는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"); } }
추가 리소스
- Azure Mobile Apps에서의 오프라인 데이터 동기화
- Azure 모바일 앱 .NET SDK 사용 방법