Azure Mobile Apps를 사용 하 여 오프 라인 데이터 동기화Synchronizing Offline Data with Azure Mobile Apps

샘플 다운로드 샘플 다운로드Download Sample Download the sample

오프 라인 동기화 하면 모바일 응용 프로그램, 보기, 추가, 또는 데이터 수정, 상호 작용할 수 없는 네트워크에 연결 하는 경우에 합니다. 변경 내용은 로컬 데이터베이스에 저장 됩니다 하 고 장치가 온라인 상태가 되 면 변경 내용을 Azure Mobile Apps 인스턴스와 동기화 될 수 있습니다. 이 문서에서는 Xamarin.Forms 응용 프로그램에 오프 라인 동기화 기능을 추가 하는 방법에 설명 합니다.Offline sync allows users to interact with a mobile application, viewing, adding, or modifying data, even where there isn't a network connection. Changes are stored in a local database, and once the device is online, the changes can be synced with the Azure Mobile Apps instance. This article explains how to add offline sync functionality to a Xamarin.Forms application.

개요Overview

Azure Mobile Client SDK 제공 된 IMobileServiceTable Azure Mobile Apps 인스턴스에 저장 된 테이블에서 수행할 수 있는 작업을 나타내는 인터페이스입니다.The Azure Mobile Client SDK provides the IMobileServiceTable interface, which represents the operations that can be performed on tables stored in the Azure Mobile Apps instance. 이러한 작업을 Azure Mobile Apps 인스턴스에 직접 연결 하 고 모바일 장치에 네트워크 연결이 없는 경우 실패 합니다.These operations connect directly to the Azure Mobile Apps instance and will fail if the mobile device doesn't have a network connection.

Azure Mobile Client SDK는 오프 라인 동기화를 지원 하려면 다음을 지원 합니다. 테이블을 동기화를 통해 제공 되는 IMobileServiceSyncTable 인터페이스입니다.To support offline sync, the Azure Mobile Client SDK supports sync tables, which are provided by the IMobileServiceSyncTable interface. 이 인터페이스는 동일한 만들기, 읽기, 업데이트, 삭제 (CRUD) 작업을 제공 합니다 IMobileServiceTable 인터페이스 되지만 작업에서 읽기 또는 쓰기는 로컬 저장소에 있습니다.This interface provides the same Create, Read, Update, Delete (CRUD) operations as the IMobileServiceTable interface, but the operations read from or write to a local store. 호출 될 때까지 로컬 저장소에서 Azure Mobile Apps 인스턴스를 새 데이터로 채워지지 끌어오기 데이터입니다.The local store isn't populated with new data from the Azure Mobile Apps instance until there is a call to pull data. 호출 될 때까지 Azure Mobile Apps 인스턴스에 데이터 전송 되지 않습니다는 마찬가지로 푸시 로컬 변경 합니다.Similarly, data isn't sent to the Azure Mobile Apps instance until there is a call to push local changes.

오프 라인 동기화에는 Azure Mobile Apps 인스턴스 및 사용자 지정 충돌 해결 프로그램에서 로컬 저장소에 있으며 동일한 레코드가 변경 된 경우 충돌을 감지 하는 것에 대 한 지원이 포함 됩니다.Offline sync also includes support for detecting conflicts when the same record has changed in both the local store and in the Azure Mobile Apps instance, and custom conflict resolution. Azure Mobile Apps 인스턴스 또는 로컬 저장소에서 충돌 하거나 처리할 수 있습니다.Conflicts can either be handled in the local store, or in the Azure Mobile Apps instance.

오프 라인 동기화에 대 한 자세한 내용은 참조 하세요. Azure Mobile Apps에서 오프 라인 데이터 동기화 하 고 Xamarin.Forms 모바일 앱에 대 한 오프 라인 동기화 사용합니다.For more information about offline sync, see Offline Data Sync in Azure Mobile Apps and Enable offline sync for your Xamarin.Forms mobile app.

설정Setup

Xamarin.Forms 응용 프로그램 및 Azure Mobile Apps 인스턴스 간에 오프 라인 동기화를 통합 하기 위한 프로세스는 다음과 같습니다.The process for integrating offline sync between a Xamarin.Forms application and an Azure Mobile Apps instance is as follows:

  1. Azure Mobile Apps 인스턴스를 만듭니다.Create an Azure Mobile Apps instance. 자세한 내용은 Azure 모바일 앱 사용합니다.For more information, see Consuming an Azure Mobile App.
  2. 추가 된 Microsoft.Azure.Mobile.Client.SQLiteStore Xamarin.Forms 솔루션의 모든 프로젝트에 NuGet 패키지.Add the Microsoft.Azure.Mobile.Client.SQLiteStore NuGet package to all projects in the Xamarin.Forms solution.
  3. (선택 사항) Azure Mobile Apps 인스턴스와 Xamarin.Forms 응용 프로그램에서 인증을 사용 하도록 설정 합니다.(Optional) Enable authentication in the Azure Mobile Apps instance and the Xamarin.Forms application. 자세한 내용은 Azure Mobile Apps를 사용 하 여 사용자 인증합니다.For more information, see Authenticating Users with Azure Mobile Apps.

다음 섹션에서는 Microsoft.Azure.Mobile.Client.SQLiteStore NuGet 패키지를 사용 하 여 유니버설 Windows 플랫폼 (UWP) 프로젝트 구성에 대 한 추가 설치 지침을 제공 합니다.The following section provides additional setup instructions for configuring Universal Windows Platform (UWP) projects to use the Microsoft.Azure.Mobile.Client.SQLiteStore NuGet package. 추가 설치 없이 iOS 및 Android에서 Microsoft.Azure.Mobile.Client.SQLiteStore NuGet 패키지를 사용 해야 합니다.No additional setup is required to use the Microsoft.Azure.Mobile.Client.SQLiteStore NuGet package on iOS and Android.

유니버설 Windows 플랫폼Universal Windows Platform

SQLite에서 Windows 플랫폼 (UWP (유니버설)을 사용 하려면 다음이 단계를 수행 합니다.To use SQLite on the Universal Windows Platform (UWP), follow these steps:

  1. 설치 합니다 유니버설 Windows 플랫폼용 SQLite 개발 환경에서 Visual Studio 확장입니다.Install the SQLite for the Universal Windows Platform Visual Studio Extension in your development environment.
  2. Visual Studio에서 UWP 프로젝트에서 마우스 오른쪽 단추로 클릭 참조 > 참조 추가, 이동할 확장 추가 합니다 유니버설 Windows 플랫폼용 SQLite유니버설 Windows 플랫폼 앱 용 visual c + + 2015 런타임 UWP 프로젝트를 확장 합니다.In the UWP project in Visual Studio, right click References > Add Reference, navigate to Extensions and add the SQLite for Universal Windows Platform and Visual C++ 2015 Runtime for Universal Windows Platform Apps extensions to the UWP project.

로컬 저장소를 초기화합니다.Initializing the Local Store

모든 동기화 테이블 작업을 수행 하려면 로컬 저장소를 초기화 합니다.The local store must be initialized before any sync table operations can be performed. 이 작업은 Xamarin.Forms 솔루션의 이식 가능한 클래스 라이브러리 (PCL) 프로젝트에서 수행 됩니다.This is achieved in the Portable Class Library (PCL) project of the Xamarin.Forms solution:

using Microsoft.WindowsAzure.MobileServices;
using Microsoft.WindowsAzure.MobileServices.SQLiteStore;
using Microsoft.WindowsAzure.MobileServices.Sync;

namespace TodoAzure
{
    public partial class TodoItemManager
    {
        static TodoItemManager defaultInstance = new TodoItemManager();
        IMobileServiceClient client;
        IMobileServiceSyncTable<TodoItem> todoTable;

        private TodoItemManager()
        {
            this.client = new MobileServiceClient(Constants.ApplicationURL);
            var store = new MobileServiceSQLiteStore("localstore.db");
            store.DefineTable<TodoItem>();
            this.client.SyncContext.InitializeAsync(store);
            this.todoTable = client.GetSyncTable<TodoItem>();
        }
        ...
  }
}

새 로컬 SQLite 데이터베이스에서 만들어집니다는 MobileServiceSQLiteStore 클래스는 이미 존재 하지 않습니다.A new local SQLite database is created by the MobileServiceSQLiteStore class, provided that it doesn't already exist. 그런 다음, DefineTable<T> 메서드는 필드와 일치 하는 로컬 저장소에 테이블을 만듭니다는 TodoItem 는 이미 존재 하지 않는 입력 합니다.Then, the DefineTable<T> method creates a table in the local store that matches the fields in the TodoItem type, provided that it doesn't already exist.

A 동기화 컨텍스트에 연관 된를 MobileServiceClient 인스턴스와 동기화 테이블에 적용 된 변경 내용을 추적 합니다.A sync context is associated with a MobileServiceClient instance, and tracks changes that are made with sync tables. 동기화 컨텍스트는 만들기, 업데이트 및 삭제 (CUD) 작업의 정렬된 된 목록을 유지 하는 큐는 나중에 보냅니다 Azure Mobile Apps 인스턴스를 유지 관리 합니다.The sync context maintains a queue that keeps an ordered list of Create, Update, and Delete (CUD) operations that will be sent to the Azure Mobile Apps instance later. IMobileServiceSyncContext.InitializeAsync() 메서드 동기화 컨텍스트를 사용 하 여 로컬 저장소를 연결할 때 사용 됩니다.The IMobileServiceSyncContext.InitializeAsync() method is used to associate the local store with the sync context.

todoTable 필드는 IMobileServiceSyncTable, 이므로 모든 CRUD 작업에는 로컬 저장소를 사용 합니다.The todoTable field is an IMobileServiceSyncTable, and so all CRUD operations use the local store.

동기화를 수행합니다.Performing Synchronization

로컬 저장소는 Azure Mobile Apps를 사용 하 여 동기화 된 경우 인스턴스는 SyncAsync 메서드:The local store is synchronized with the Azure Mobile Apps instance when the SyncAsync method is invoked:

public async Task SyncAsync()
{
  ReadOnlyCollection<MobileServiceTableOperationError> syncErrors = null;

  try
  {
    await this.client.SyncContext.PushAsync();

    // The first parameter is a query name that is used internally by the client SDK to implement incremental sync.
    // Use a different query name for each unique query in your program.
    await this.todoTable.PullAsync("allTodoItems", this.todoTable.CreateQuery());
  }
  catch (MobileServicePushFailedException exc)
  {
    if (exc.PushResult != null)
    {
      syncErrors = exc.PushResult.Errors;
    }
  }

  // Simple error/conflict handling.
  if (syncErrors != null)
  {
    foreach (var error in syncErrors)
    {
      if (error.OperationKind == MobileServiceTableOperationKind.Update && error.Result != null)
      {
        // Update failed, revert to server's copy
        await error.CancelAndUpdateItemAsync(error.Result);
      }
      else
      {
        // Discard local change
        await error.CancelAndDiscardItemAsync();
      }

      Debug.WriteLine(@"Error executing sync operation. Item: {0} ({1}). Operation discarded.", error.TableName, error.Item["id"]);
    }
  }
}

IMobileServiceSyncTable.PushAsync 메서드는 특정 테이블 보다는 동기화 컨텍스트에에서 작동 하 고 마지막 푸시 이후로 모든 CUD 변경을 보냅니다.The IMobileServiceSyncTable.PushAsync method operates on the sync context, rather than a specific table, and sends all CUD changes since the last push.

끌어오기가 수행한는 IMobileServiceSyncTable.PullAsync 단일 테이블에서 메서드.Pull is performed by the IMobileServiceSyncTable.PullAsync method on a single table. 첫 번째 매개 변수는 PullAsync 메서드는 모바일 장치에만 사용 되는 쿼리 이름입니다.The first parameter to the PullAsync method is a query name that is used only on the mobile device. 수행 하는 Azure Mobile Client SDK 이름 결과 null이 아닌 쿼리를 제공 하는 증분 동기화때마다 가져오기 작업을 반환 하는 위치 결과 얻으려면 최신, updatedAt 로컬에 저장 된 결과의 타임 스탬프 시스템 테이블입니다.Providing a non-null query name results in the Azure Mobile Client SDK performing an incremental sync, where each time a pull operation returns results, the latest updatedAt timestamp from the results is stored in the local system tables. 후속 끌어오기 작업은 다음 레코드가 해당 timestamp 이후의 검색 합니다.Subsequent pull operations then only retrieve records after that timestamp. 한편 전체 동기화 전달 하 여 수행할 수 있습니다 null 쿼리 이름으로 각 끌어오기 작업에서 검색 되는 모든 레코드의 결과입니다.Alternatively, full sync can be achieved by passing null as the query name, which results in all records being retrieved on each pull operation. 모든 동기화 작업에 다음 받은 데이터는 로컬 저장소에 삽입 됩니다.Following any sync operation, received data is inserted into the local store.

참고

끌어오기가 로컬 업데이트를 보류 중인 테이블에 대해를 실행 하는 경우 끌어오기 동기화 컨텍스트에 푸시를 먼저 실행 됩니다.If a pull is executed against a table that has pending local updates, the pull will first execute a push on the sync context. 이 이미 큐에 대기 중인 변경 내용과 Azure Mobile Apps 인스턴스에서 새 데이터 간에 충돌을 최소화 합니다.This minimizes conflicts between changes that are already queued and new data from the Azure Mobile Apps instance.

SyncAsync 메서드는 모두 로컬 저장소에 Azure Mobile Apps 인스턴스를 동일한 레코드가 변경 될 때 충돌을 처리 하는 것에 대 한 기본 구현에도 포함 되어 있습니다.The SyncAsync method also includes a basic implementation for handling conflicts when the same record has changed in both the local store and in the Azure Mobile Apps instance. 로컬 저장소와 Azure Mobile Apps 인스턴스에서 데이터가 업데이트 된 경우 충돌을 SyncAsync 메서드 Azure Mobile Apps 인스턴스에 저장 된 데이터에서 로컬 저장소에 데이터를 업데이트 합니다.When the conflict is that data has been updated both in the local store and in the Azure Mobile Apps instance, the SyncAsync method updates the data in the local store from the data stored in the Azure Mobile Apps instance. 다른 충돌이 발생 하면는 SyncAsync 메서드 로컬 변경 내용을 취소 합니다.When any other conflict occurs, the SyncAsync method discards the local change. Azure Mobile Apps 인스턴스에서 삭제 되는 데이터에 대 한 로컬 변경 있는 시나리오를 처리 합니다.This handles the scenario where a local change exists for data that's been deleted from the Azure Mobile Apps instance.

개발자가 프로덕션 응용 프로그램에서 사용자 지정 작성 해야 IMobileServiceSyncHandler 충돌 처리 구현 해당 사용 사례에 적합 합니다.In a production application, developers should write a custom IMobileServiceSyncHandler conflict-handling implementation that's suited to their use case. 자세한 내용은 충돌 해결을 위해 사용 하 여 낙관적 동시성 Azure portal에서 및 관리 되는 클라이언트 SDK의에서 오프 라인 지원에 대 한 심층 분석 on MSDN 블로그.For more information, see Use Optimistic Concurrency for conflict resolution on the Azure portal, and Deep dive on the offline support in the managed client SDK on MSDN blogs.

데이터를 제거합니다.Purging Data

사용 하 여 데이터의 로컬 저장소의 테이블을 지울 수 있습니다는 IMobileServiceSyncTable.PurgeAsync 메서드.Tables in the local store can be cleared of data with the IMobileServiceSyncTable.PurgeAsync method. 이 메서드는 응용 프로그램이 더 이상 필요 하지 않는 오래 된 데이터를 제거 하는 등의 시나리오를 지원 합니다.This method supports scenarios such as removing stale data that an application no longer requires. 예를 들어, 샘플 응용 프로그램 표시만 TodoItem 완료 되지 않은 인스턴스가 있습니다.For example, the sample application only displays TodoItem instances that aren't complete. 따라서 완료 된 항목은 더 이상 로컬로 저장 해야 합니다.Therefore, completed items no longer need to be stored locally. 다음과 같이 로컬 저장소에서 완료 된 항목 제거를 수행할 수 있습니다.Purging completed items from the local store can be accomplished as follows:

await todoTable.PurgeAsync(todoTable.Where(item => item.Done));

에 대 한 호출 PurgeAsync 도 푸시 작업을 트리거합니다.A call to PurgeAsync also triggers a push operation. 따라서 로컬 저장소에서 제거 하기 전에 로컬로 완료로 표시 되는 모든 항목 Azure Mobile Apps 인스턴스에 전송 됩니다.Therefore, any items that are marked as complete locally will be sent to the Azure Mobile Apps instance before being removed from the local store. 그러나 Azure Mobile Apps 인스턴스와 동기화 보류 중인 작업이 없으면 지우기 시킵니다를 InvalidOperationException 하지 않는 한는 force 매개 변수는 설정 true.However, if there are operations pending synchronization with the Azure Mobile Apps instance, the purge will throw an InvalidOperationException unless the force parameter is set to true. 대체 전략을 검토 하는 것은 IMobileServiceSyncContext.PendingOperations 보류 중인 Azure Mobile Apps 인스턴스에 푸시되 지 않은 속성이 0 이면 지우기만 수행 하는 작업의 수를 반환 하는 속성입니다.An alternative strategy is to examine the IMobileServiceSyncContext.PendingOperations property, which returns the number of pending operations that haven't been pushed to the Azure Mobile Apps instance, and only perform the purge if the property is zero.

참고

호출 PurgeAsync 사용 하 여 합니다 force 매개 변수 설정 true 보류 중인 변경 내용이 손실 됩니다.Invoking PurgeAsync with the force parameter set to true will lose any pending changes.

동기화 작업 시작Initiating Synchronization

샘플 응용 프로그램에서 SyncAsync 메서드를 통해 호출 되는 TodoList.OnAppearing 메서드:In the sample application, the SyncAsync method is invoked through the TodoList.OnAppearing method:

protected override async void OnAppearing()
{
  base.OnAppearing();

  // Set syncItems to true to synchronize the data on startup when running in offline mode
  await RefreshItems(true, syncItems: true);
}

즉, 응용 프로그램은 시작할 때 Azure Mobile Apps 인스턴스와 동기화 하려고 합니다.This means that the application will attempt to sync with the Azure Mobile Apps instance when it starts.

또한 시작할 수 있습니다 iOS 및 Android에서 끌어오기를 사용 하 여 Windows 플랫폼에서 데이터를 목록에 새로 고침을 사용 하 여 합니다 동기화 사용자 인터페이스에서 단추입니다.In addition, sync can be initiated in iOS and Android by using pull to refresh on the list of data, and on the Windows platforms by using the Sync button on the user interface. 자세한 내용은 고치려면 당김합니다.For more information, see Pull to Refresh.

요약Summary

이 문서에서는 Xamarin.Forms 응용 프로그램에 오프 라인 동기화 기능을 추가 하는 방법을 설명 합니다.This article explained how to add offline sync functionality to a Xamarin.Forms application. 오프 라인 동기화 하면 모바일 응용 프로그램, 보기, 추가, 또는 데이터 수정, 상호 작용할 수 없는 네트워크에 연결 하는 경우에 합니다.Offline sync allows users to interact with a mobile application, viewing, adding, or modifying data, even where there isn't a network connection. 변경 내용은 로컬 데이터베이스에 저장 됩니다 하 고 장치가 온라인 상태가 되 면 변경 내용을 Azure Mobile Apps 인스턴스와 동기화 될 수 있습니다.Changes are stored in a local database, and once the device is online, the changes can be synced with the Azure Mobile Apps instance.