정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

연습: Windows Phone 8의 로컬 데이터베이스 앱 업데이트

2014-06-18

적용 대상: Windows Phone 8 및 Windows Phone Silverlight 8.1 | Windows Phone OS 7.1

 

Windows Phone OS 7.1 부터는 앱의 로컬 폴더에 있는 관계형 데이터를 로컬 데이터베이스에 저장할 수 있습니다. 앱이 발전하면서 앱이 단말기에 배포된 후 데이터베이스 스키마를 변경해야 할 수 있습니다. 대부분이 스키마 업데이트에는 DatabaseSchemaUpdater 클래스를 사용할 수 있습니다. DatabaseSchemaUpdater를 사용하여 열, 인덱스, 테이블 및 연결을 로컬 데이터베이스에 앱 업데이트의 일부로 추가할 수 있습니다. 이 연습에서는 로컬 데이터베이스 샘플 앱을 예제로 사용하여 로컬 데이터베이스를 업데이트하는 방법에 대해 설명합니다. Windows Phone 앱에서 로컬 데이터베이스를 사용하는 방법에 대한 자세한 내용은 Windows Phone 8의 로컬 데이터베이스를 참조하세요.

참고참고:

로컬 데이터베이스에서 열/인덱스/테이블을 추가하는 것보다 더 광범위한 변경을 적용해야 하는 경우 새 데이터베이스를 만들고 이전 데이터베이스에서 새 데이터베이스로 데이터를 마이그레이션해야 할 수 있습니다. 자세한 내용은 Windows Phone 8의 로컬 데이터베이스 마이그레이션 개요를 참조하세요.

이 연습에서는 로컬 데이터베이스 샘플을 두 번 업데이트합니다. 첫 번째 업데이트에서는 각 작업의 우선 순위를 저장할 열을 추가합니다. 두 번째 업데이트에서는 Items 테이블에 인덱스를 추가합니다. 연습의 각 단계 후에는 격리된 저장소 탐색기를 사용하여 이전 데이터베이스 버전에서 업데이트를 테스트합니다. 격리된 저장소 탐색기에 대한 자세한 내용은 Windows Phone 8의 격리된 저장소 탐색기 도구를 사용하는 방법을 참조하세요.

이 연습을 완료한 후 업데이트된 로컬 데이터베이스 샘플은 다음 예제와 같습니다.

AP_Con_LocalDatabaseUpdate_Features

이 예제에서 첫 번째 업데이트의 일부로 추가된 우선 순위 열에서는 각 작업 색이 작업 우선 순위에 따라 변경될 수 있습니다. 할당된 우선 순위가 없는 항목은 흰색으로 유지됩니다. 다음 이미지에서는 기본 페이지와 새 작업 페이지에서 새 우선 순위 기능을 사용하는 방법을 보여 줍니다.

이 항목에는 다음 단원이 포함되어 있습니다.

 

이 섹션에서는 로컬 데이터베이스 샘플을 실행하고 일부 작업을 데이터베이스에 추가한 다음 이 연습의 뒷부분에서 업데이트를 테스트하기 위해 데이터베이스 복사본을 저장합니다. 로컬 데이터베이스 샘플의 작동 방식에 대한 자세한 내용은 Windows Phone 8의 로컬 데이터베이스 앱(MVVM 포함)을 만드는 방법를 참조하세요.

참고참고:

데이터베이스를 만들 때 데이터베이스 스키마 버전을 명시적으로 지정하지 않았으므로 로컬 데이터베이스 샘플의 DatabaseSchemaVersion 속성은 이 연습을 시작할 때의 0과 같습니다. 다음 버전의 데이터베이스와 관련된 혼동을 줄이기 위해 이 연습에서는 버전 1을 건너뜁니다.

버전 0에 대한 기준선 데이터베이스를 만들려면

  1. 로컬 데이터베이스 샘플(C#)을 다운로드하고 프로젝트를 컴퓨터의 폴더에 저장합니다.

  2. 프로젝트의 압축을 풀고 Visual Studio에서 엽니다.

  3. F5 키를 눌러 디버깅을 시작하고 앱을 테스트합니다.

  4. 에뮬레이터 또는 단말기의 앱 바에서 추가 버튼을 탭하여 앱에 여러 작업을 추가합니다. 각 앱 피벗 페이지에서 작업을 보려면 각 카테고리(Home, WorkHobbies)로 작업을 추가합니다

    팁팁:

    Windows Phone 에뮬레이터를 사용하는 경우 Page Up 키를 눌러 키보드로 텍스트 값을 입력합니다.

    다음 이미지는 home task, work taskhobby task의 세 가지 작업이 있는 데이터베이스 버전 0을 보여 줍니다.

    AP_Con_LocalDatabaseUpdate_Baseline0
  5. 디버그 메뉴에서 디버깅 중지를 클릭합니다 에뮬레이터를 닫거나 단말기의 테더링을 취소하거나 에뮬레이터 또는 단말기에서 앱을 실행하지 마세요.

  6. 컴퓨터에 LocalDatabaseVersion0이라는 폴더를 만듭니다. 이 폴더는 데이터베이스 스키마 버전 0의 기준선 데이터베이스를 저장하는 데 사용됩니다.

  7. 격리된 저장소 탐색기를 사용하여 앱에서 LocalDatabaseVersion0 폴더로 로컬 데이터베이스를 복사합니다. 자세한 내용은 Windows Phone 8의 격리된 저장소 탐색기 도구를 사용하는 방법을 참조하세요. 다음 예제에서는 에뮬레이터에서 c:\LocalDatabaseVersion0\ToDo.sdf로 데이터베이스 파일을 복사합니다.

    ISETool.exe ts xd 77a80316-384d-40dc-a8c3-c4054676e85c "C:\LocalDatabaseVersion0"
    

    GUID 값은 앱 매니페스트 파일에서 확인된 앱의 Product ID에 해당합니다. 앱의 Product ID가 이 예제에서 사용된 ID와 다를 수도 있습니다.

  8. 이제 데이터베이스 스키마 버전 0에 데이터베이스 복사본이 있습니다. 이 데이터베이스 파일을 사용하면 격리된 저장소 탐색기의 스냅숏 복원(rs) 명령을 통해 로컬 데이터베이스를 업데이트 전 날짜로 롤백할 수 있습니다.

이 섹션에서는 앱의 두 번째 버전 및 로컬 데이터베이스 스키마를 준비합니다. 버전 2에서는 각 작업의 색이 작업 우선 순위에 따라 변경될 수 있습니다.

이 기능을 구현하기 위해 다음 파일이 업데이트되거나 추가됩니다.

  • Model\ToDoDataContext.cs: 이 파일을 업데이트하여 새 우선 순위 열을 정의합니다.

  • ViewModel\ToDoViewModel.cs: 이 파일을 업데이트하여 새 작업에 유효한 우선 순위 목록을 제공합니다.

  • NewTaskPage.xaml 및 NewTaskPage.xaml.cs: 이 파일을 업데이트하여 새 작업과 연결된 우선 순위를 지정하기 위한 ListPicker 컨트롤을 추가합니다.

  • PriorityToColorConverter.cs: 이 파일을 추가하여 작업 우선 순위를 기본 페이지 UI에 표시된 작업에 바인딩할 수 있는 SolidColorBrush 개체로 변환합니다.

  • MainPage.xaml: 이 파일을 업데이트하여 작업 색을 해당 작업 우선 순위에 바인딩합니다.

  • App.xaml.cs: 이 파일을 수정하여 데이터베이스 업데이트 논리를 추가합니다.

버전 2를 준비하려면

  1. Model\ToDoDataContext.cs 파일에서 다음 코드를 ToDoItem 클래스에 추가합니다.

    // Define Priority: field, public property, and database column.
    // Added in Version 2 of the application.
    private int? _priority;
    
    [Column(CanBeNull = true)]
    public int? Priority
    {
        get { return _priority; }
        set
        {
            if (_priority != value)
            {
                NotifyPropertyChanging("Priority");
                _priority = value;
                NotifyPropertyChanged("Priority");
            }
        }
    }
    
    

    이 코드는 Priority라는 새 데이터베이스 열을 정의합니다. 이 코드가 클래스에 표시되는 순서는 중요하지 않습니다. CanBeNull 열 특성을 사용하면 데이터베이스의 기존 데이터가 새 열과 호환될 수 있습니다.

  2. ViewModel\ToDoViewModel.cs 파일에서 다음 코드를 ToDoViewModel 클래스에 추가합니다.

    // Valid priorities for new tasks.
    // Added in Version 2 of the application.
    private List<int> _prioritiesList = new List<int> { 1, 2, 3 };
    public List<int> PrioritiesList
    {
        get { return _prioritiesList; }
    }
    
  3. NewTaskPage.xaml 파일에서 ContentPanel이라는 StackPanelcategoriesListPicker. 바로 아래에 다음 코드를 추가합니다.

    <!-- Added in Version 2 of the application. -->
    <TextBlock 
        Text="Priority"
        Style="{StaticResource PhoneTextNormalStyle}"
        />
    <toolkit:ListPicker
        x:Name="priorityListPicker"
        ItemsSource="{Binding PrioritiesList}">
    </toolkit:ListPicker>
    <!-- End of Version 2 update. -->
    
    

    이 코드는 새 작업과 연결된 우선 순위를 지정하기 위해 ListPicker 컨트롤을 추가합니다.

  4. NewTaskPage.xaml.cs 파일에서 newToDoItem 개체를 만드는 코드를 업데이트하여 Priority 속성을 다음과 같이 지정합니다.

    // Create a new task.
    ToDoItem newToDoItem = new ToDoItem
    {
        ItemName = newTaskNameTextBox.Text,
        Category = (ToDoCategory)categoriesListPicker.SelectedItem,
    
        // Set the priority of the new task to the specified priority.
        // Added in Version 2 of the application.
        Priority = (int)priorityListPicker.SelectedItem
    };
    
    
  5. 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 추가, 새 항목을 차례로 선택합니다.

  6. 새 항목 추가 창에서 코드 파일을 선택하고 파일 이름을 PriorityToColorConverter.cs로 지정합니다. 그런 다음 추가를 클릭합니다.

  7. PriorityToColorConverter.cs 파일에서 모든 코드를 다음과 같이 바꿉니다.

    using System;
    using System.Windows.Media;
    using System.Windows.Data;
    
    namespace LocalDatabaseSample
    {
        // Convert task priority to a brush that can be bound to in the UI.
        // Added in Version 2 of the application.
        public class PriorityToColorConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                // Allow for tasks that have no priority.
                int? priority = (int?)value;
    
                // Assign color based on priority.
                switch (priority)
                {
                    case null:
                        return new SolidColorBrush(Colors.White);
                    case 1:
                        return new SolidColorBrush(Colors.Red);
                    case 2:
                        return new SolidColorBrush(Colors.Yellow);
                    case 3:
                        return new SolidColorBrush(Colors.Green);
                    default:
                        return new SolidColorBrush(Colors.White);
                }
            }
    
            // Unused; required for IValueConverter implementation.
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            { throw new NotImplementedException();}
        }
    }
    
    
  8. MainPage.xaml 파일에서 다음 특성을 phone:PhoneApplicationPage 요소에 추가합니다.

        xmlns:local="clr-namespace:LocalDatabaseSample"
    

    이 코드는 기본 페이지에서 사용할 PriorityToColorConverter에 필요한 네임스페이스를 추가합니다.

  9. MainPage.xaml에서 phone:PhoneApplicationPage.Resources 요소의 ToDoListBoxItemTemplate이라는 DataTemplate 위에 다음 요소를 추가합니다.

    <!-- Resource & namespace specified in Version 2 of the application. -->
    <local:PriorityToColorConverter x:Key="PriorityToColorConverter" />     
    
    

    이 코드는 기본 페이지에서 PriorityToColorConverter를 리소스로 추가합니다.

  10. MainPage.xamlToDoListBoxItemTemplate이라는 DataTemplate 내에서 Foreground 속성을 다음과 같이 지정하여 TextBlock을 업데이트합니다.

    <!-- Foreground specified in Version 2 of the application. -->
    <TextBlock 
        Text="{Binding ItemName}" 
        FontSize="{StaticResource PhoneFontSizeLarge}" 
        Grid.Column="1" Grid.ColumnSpan="2" 
        VerticalAlignment="Top" Margin="-36, 12, 0, 0"
        Foreground="{Binding Priority, Converter={StaticResource PriorityToColorConverter}}"
        />
    
    

    이 코드는 PriorityToColorConverter 리소스를 기준으로 작업 텍스트의 전경색을 우선 순위에 바인딩합니다.

  11. App.xaml.cs 파일에서 다음 지시문을 페이지 맨 위에 추가합니다.

    // Directive for DatabaseSchemaUpdater
    // Added in Version 2 of the application.
    using Microsoft.Phone.Data.Linq;
    
    

    이 코드는 다음 단계 중 하나에서 DatabaseSchemaUpdater 개체를 만드는 데 사용됩니다.

  12. App.xaml.cs 파일에서 App 클래스에 다음 코드를 추가합니다.

    // The current version of the application.
    public static int APP_VERSION = 2;
    
    
  13. App.xaml.cs에서 db라는 ToDoDataContext에 대한 using 문을 다음과 같이 바꿉니다.

    using (ToDoDataContext db = new ToDoDataContext(DBConnectionString))
    {
        // Create the database if it does not exist.
        if (db.DatabaseExists() == false)
        {
            // Create the local database.
            db.CreateDatabase();
    
            // Prepopulate the categories.
            db.Categories.InsertOnSubmit(new ToDoCategory { Name = "Home" });
            db.Categories.InsertOnSubmit(new ToDoCategory { Name = "Work" });
            db.Categories.InsertOnSubmit(new ToDoCategory { Name = "Hobbies" });
    
            // Save categories to the database.
            db.SubmitChanges();
    
            // Set the new database version.
            DatabaseSchemaUpdater dbUpdater = db.CreateDatabaseSchemaUpdater();
            dbUpdater.DatabaseSchemaVersion = APP_VERSION;
            dbUpdater.Execute();
        }
        else
        {
            // Check whether a database update is needed.
            DatabaseSchemaUpdater dbUpdater = db.CreateDatabaseSchemaUpdater();
                                            
            if (dbUpdater.DatabaseSchemaVersion < APP_VERSION)
            {
                // Add the Priority column (added in version 2).
                dbUpdater.AddColumn<ToDoItem>("Priority");
    
                // Add the new database version.
                dbUpdater.DatabaseSchemaVersion = 2;
    
                // Perform the database update in a single transaction.
                dbUpdater.Execute();
            }
        }
    }
    
    

    이 코드는 if 문에 else 절을 추가하여 앱이 필요한 경우 데이터베이스를 업데이트할 수 있게 합니다. dbUpdater 개체에서 Execute 메서드가 호출될 때까지 변경 내용이 데이터베이스에 적용되지 않습니다.

  14. 빌드 메뉴에서 다시 빌드 옵션을 클릭하여 솔루션을 다시 빌드합니다. Visual Studio Express에 빌드 메뉴가 표시되지 않는 경우 도구 메뉴에서 설정을 클릭하고 전문가 설정을 선택하여 이 메뉴를 사용하도록 설정합니다.

  15. 로컬 데이터베이스 샘플 앱에 대한 버전 2 업데이트를 완료했습니다. F5 키를 누르고 앱을 실행하여 앱 기능을 테스트합니다.

    참고참고:

    Visual Studio의 상태에 따라 에뮬레이터나 단말기에서 저장한 데이터가 이때 앱에 표시되지 않을 수도 있습니다. 다음 섹션에서는 데이터베이스 버전 0의 데이터가 복원됩니다.

이 섹션에서는 앱의 데이터베이스 업데이트 코드를 테스트합니다. 이 지점에 도달할 때의 Visual Studio 상태에 따라 데이터베이스 버전 0의 데이터가 에뮬레이터나 단말기에 표시되지 않을 수도 있습니다.

앱 업데이트를 시뮬레이션하려면 새 버전의 앱이 단말기에 배포된 후 격리된 저장소 탐색기를 사용하여 데이터베이스 버전 0을 복원합니다. Windows Phone 스토어 에서 단말기의 앱을 업데이트하는 경우 앱 코드만 업데이트되고 로컬 폴더는 앱 업데이트 프로세스에서 수정되지 않습니다.

데이터베이스 업데이트를 테스트하려면

  1. 빌드 메뉴에서 다시 빌드 옵션을 클릭하여 솔루션을 다시 빌드합니다. Visual Studio Express에 빌드 메뉴가 표시되지 않는 경우 도구 메뉴에서 설정을 클릭하고 전문가 설정을 선택하여 이 메뉴를 사용하도록 설정합니다.

  2. F5 키를 눌러 디버깅을 시작합니다. 그러면 새 버전의 앱이 에뮬레이터나 단말기에 배포됩니다.

    참고참고:

    앱의 로컬 폴더에 복사하려면 격리된 저장소 탐색기에서 동일한 Product ID를 가진 앱 인스턴스가 하나 이상 에뮬레이터나 단말기에 있어야 합니다. 디버거를 실행하면 이 조건이 충족됩니다.

  3. 디버그 메뉴에서 디버깅 중지를 클릭합니다 에뮬레이터를 닫거나 단말기의 테더링을 취소하지 마세요. 그러면 앱이 닫히고 로컬 폴더에 있는 로컬 데이터베이스 파일의 제어가 해제됩니다.

  4. 격리된 저장소 탐색기를 사용하여 LocalDatabaseVersion0 폴더에서 에뮬레이터나 단말기로 버전 0 데이터베이스를 복원합니다. 자세한 내용은 Windows Phone 8의 격리된 저장소 탐색기 도구를 사용하는 방법을 참조하세요. 다음 예제에서는 c:\LocalDatabaseVersion0\ToDo.sdf에서 에뮬레이터로 버전 0 데이터베이스 파일을 복사합니다.

    중요중요:

    데이터베이스를 성공적으로 복원하려면 이 명령을 수행할 때 디버거 사용 여부에 관계없이 앱이 실행되고 있지 않아야 합니다. 앱에 삭제 표식이 지정된 경우 단말기가 시작으로 이동할 때까지 뒤로 버튼을 눌러 앱 스택에서 제거해야 할 수도 있습니다.

    ISETool.exe rs xd 77a80316-384d-40dc-a8c3-c4054676e85c "C:\LocalDatabaseVersion0"
    

    GUID 값은 앱 매니페스트 파일에서 확인된 앱의 Product ID에 해당합니다. 앱의 Product ID가 이 예제에서 사용된 ID와 다를 수도 있습니다.

  5. 이제 새 버전의 앱이 데이터베이스 버전 0으로 실행되기 직전에 앱이 스토어 업데이트를 시뮬레이션하는 상태입니다. 데이터베이스 업데이트 코드를 단계별로 실행하려면 App.xaml.cs 파일의 다음 코드 줄에 디버깅 중단점을 설정합니다.

    if (db.DatabaseExists() == false)
    
  6. F5 키를 눌러 디버깅을 시작합니다. 새 버전의 앱이 단말기에 다시 배포되고 데이터베이스 버전 1.0으로 실행되기 시작합니다.

  7. 디버거가 중단점에 도달한 후 과정 종료 버튼을 클릭하여 데이터베이스 업데이트 코드를 살펴봅니다. 데이터베이스가 업데이트되기 전후에 dbUpdater 개체의 DatabaseSchemaVersion 속성을 관찰합니다(dbUpdater 개체 이름을 마우스로 가리킴).

    다음 예제에서는 Execute 메서드가 호출되기 전(빨간색 화살표)과 후(파란색 화살표) dbUpdaterDatabaseSchemaVersion을 보여 줍니다.

    AP_Con_LocalDatabaseUpdate_Debugging
  8. 중단점을 제거하고 F5 키를 눌러 디버깅을 시작하고 앱을 계속 실행합니다. 다음 이미지와 같이 앱이 버전 0의 기준선으로 저장한 작업을 시작하고 표시합니다.

    AP_Con_LocalDatabaseUpdate_Baseline0

    앱 버전 0으로 만든 작업에 우선 순위 값이 연결되어 있지 않으므로 PriorityToColorConverter에서 White 색을 할당했습니다.

  9. 업데이트 테스트를 완료하면 디버깅을 중지합니다. 디버그 메뉴에서 디버깅 중지를 클릭합니다 에뮬레이터를 닫거나 단말기의 테더링을 취소하지 마세요. 그러면 앱이 닫히고 로컬 폴더에 있는 로컬 데이터베이스 파일의 제어가 해제됩니다.

이 섹션에서는 앱 버전 2를 실행하고 일부 작업을 데이터베이스에 추가하고 다음 버전의 데이터베이스 업데이트 코드를 테스트하기 위해 데이터베이스 복사본을 저장합니다.

버전 2에 대한 기준선 데이터베이스를 만들려면

  1. 앱 버전 2가 실행되고 있지 않으면 F5 키를 눌러 디버깅을 시작하고 앱을 테스트합니다.

  2. 에뮬레이터 또는 단말기의 앱 바에서 추가 버튼을 탭하여 우선 순위와 완료 상태가 다른 새 작업을 앱에 추가합니다. 필요에 따라 버전 0 기준선에서 작업을 제거하여 새 작업에 사용할 공간을 확보합니다.

    다음 이미지는 버전 0에서 복원된 일부 작업과 앱의 새 우선 순위 기능을 설명하는 새 작업, task priority 1, task priority 2task priority 3이 포함된 데이터베이스 버전 2를 보여 줍니다

    AP_Con_LocalDatabaseUpdate_Baseline2
  3. 디버그 메뉴에서 디버깅 중지를 클릭합니다 에뮬레이터를 닫거나 단말기의 테더링을 취소하지 마세요.

  4. 컴퓨터에 LocalDatabaseVersion2라는 폴더를 만듭니다. 이 폴더는 데이터베이스 스키마 버전 2의 기준선 데이터베이스를 저장하는 데 사용됩니다.

  5. 격리된 저장소 탐색기를 사용하여 앱에서 LocalDatabaseVersion2 폴더로 로컬 데이터베이스를 복사합니다. 자세한 내용은 Windows Phone 8의 격리된 저장소 탐색기 도구를 사용하는 방법을 참조하세요. 다음 예제에서는 에뮬레이터에서 c:\LocalDatabaseVersion2\ToDo.sdf로 데이터베이스 파일을 복사합니다.

    ISETool.exe ts xd 77a80316-384d-40dc-a8c3-c4054676e85c "C:\LocalDatabaseVersion2"
    

    GUID 값은 앱 매니페스트 파일에서 확인된 앱의 Product ID에 해당합니다. 앱의 Product ID가 이 예제에서 사용된 ID와 다를 수도 있습니다.

  6. 이제 데이터베이스 스키마 버전 2에 데이터베이스 복사본이 있습니다. 다음 섹션에서 계속해서 데이터베이스 스키마를 추가로 업데이트합니다.

이 섹션에서는 앱의 세 번째 버전 및 로컬 데이터베이스 스키마를 준비합니다. 버전 3에서는 데이터베이스에 보조 인덱스를 추가하고 여러 업그레이드 경로를 고려하도록 데이터베이스 업데이트 논리를 준비하는 과정을 보여 줍니다.

중요중요:

고객이 앱의 모든 업데이트를 설치하도록 선택하지 않을 수도 있습니다. 앱을 시작할 때 단말기의 데이터베이스 파일이 이전 앱 버전일 수 있다는 것을 고려해야 합니다.

버전 3을 준비하려면

  1. Model\ToDoDataContext.cs 파일에서 다음 지시문을 파일 맨 위에 추가합니다.

    // Directive for Index attribute.
    // Added in Version 3 of the application.
    using Microsoft.Phone.Data.Linq.Mapping;
    
    
  2. Model\ToDoDataContext.cs에서 다음 LINQ to SQL 매핑 특성을 ToDoItem 클래스의 [Table] 특성 바로 아래에 추가합니다.

    // Index added in version 3 of the application.
    [Index(Columns = "Priority", Name = "PriorityIndex")]
    

    이 코드는 우선 순위 열에 오름차순 인덱스를 추가합니다. 이 인덱스를 데이터베이스에 추가하는 것은 데모용일 뿐입니다. 해당 성능 이점을 이용하도록 앱을 업데이트하는 것은 이 항목의 범위를 벗어납니다.

  3. App.xaml.cs 파일에서 App 클래스의 APP_VERSION 속성을 업데이트합니다.

    // The current version of the application.
    public static int APP_VERSION = 3;
    
    
  4. App.xaml.cs에서 db라는 ToDoDataContext에 대한 using 문을 다음과 같이 업데이트합니다.

    using (ToDoDataContext db = new ToDoDataContext(DBConnectionString))
    {
        // Create the database if it does not exist.
        if (db.DatabaseExists() == false)
        {
            // Create the local database.
            db.CreateDatabase();
    
            // Prepopulate the categories.
            db.Categories.InsertOnSubmit(new ToDoCategory { Name = "Home" });
            db.Categories.InsertOnSubmit(new ToDoCategory { Name = "Work" });
            db.Categories.InsertOnSubmit(new ToDoCategory { Name = "Hobbies" });
    
            // Save categories to the database.
            db.SubmitChanges();
    
            // Set the new database version.
            DatabaseSchemaUpdater dbUpdater = db.CreateDatabaseSchemaUpdater();
            dbUpdater.DatabaseSchemaVersion = APP_VERSION;
            dbUpdater.Execute();
        }
        else
        {
            // Check whether a database update is needed.
            DatabaseSchemaUpdater dbUpdater = db.CreateDatabaseSchemaUpdater();
    
            if (dbUpdater.DatabaseSchemaVersion < APP_VERSION)
            {
                // Perform version 2.0 update, as applicable.
                if (dbUpdater.DatabaseSchemaVersion < 2)
                {
                    // Add the Priority column (added in version 2.0).
                    dbUpdater.AddColumn<ToDoItem>("Priority");
                }
    
                // Add the Priority index (added in version 3.0).
                dbUpdater.AddIndex<ToDoItem>("PriorityIndex");
    
                // Set the new database version.
                dbUpdater.DatabaseSchemaVersion = 3;
    
                // Perform the database update in a single transaction.
                dbUpdater.Execute();
            }
        }
    }
    
    

    이 코드는 else 절을 업데이트하여 PriorityIndex라는 보조 인덱스를 추가하고 필요한 경우 Priority 열을 추가합니다. 고객이 앱의 모든 업데이트를 설치하도록 선택하지 않을 수도 있습니다. 앱을 시작할 때 단말기의 데이터베이스 파일이 이전 앱 버전일 수 있다는 것을 고려해야 합니다.

  5. 빌드 메뉴에서 다시 빌드 옵션을 클릭하여 솔루션을 다시 빌드합니다. Visual Studio Express에 빌드 메뉴가 표시되지 않는 경우 도구 메뉴에서 설정을 클릭하고 전문가 설정을 선택하여 이 메뉴를 사용하도록 설정합니다.

  6. 이제 앱에 대한 버전 3 업데이트를 완료했습니다. 다음 섹션에서 계속해서 이전 버전의 데이터베이스에서 데이터베이스 업데이트를 테스트합니다.

이 섹션에서는 다양한 버전의 데이터베이스 스키마에서 앱 업데이트를 시뮬레이션하여 버전 3 데이터베이스 업데이트 논리를 테스트합니다. 고객이 일부 앱 업데이트를 설치하지 않을 수도 있습니다. 데이터베이스 업데이트 논리가 이전 버전의 데이터베이스 스키마에서 원하는 대로 수행되는지 확인해야 합니다.

버전 0에서 버전 3 업데이트를 테스트하려면

  • 데이터베이스 스키마 버전 0에 대해 버전 3 데이터베이스 업데이트 논리를 테스트합니다. 이 연습 데이터베이스 업데이트 테스트의 앞부분에서 설명한 프로세스를 사용하여 LocalDatabaseVersion0 폴더에 저장된 데이터베이스로 테스트합니다.

    예를 들어 다음 명령줄 문은 c:\LocalDatabaseVersion0\ToDo.sdf에서 에뮬레이터로 버전 0 데이터베이스 파일을 복사합니다.

    ISETool.exe rs xd 77a80316-384d-40dc-a8c3-c4054676e85c "C:\LocalDatabaseVersion0"
    

    GUID 값은 앱 매니페스트 파일에서 확인된 앱의 Product ID에 해당합니다. 앱의 Product ID가 이 예제에서 사용된 ID와 다를 수도 있습니다.

    버전 0 데이터베이스로 버전 3의 앱을 시작하면 버전 0 기준선으로 저장한 작업만 표시됩니다.

    AP_Con_LocalDatabaseUpdate_Baseline0

버전 2에서 버전 3 업데이트를 테스트하려면

  • 데이터베이스 스키마 버전 2에 대해 버전 3 데이터베이스 업데이트 논리를 테스트합니다. 이 연습 데이터베이스 업데이트 테스트의 앞부분에서 설명한 프로세스를 사용하여 LocalDatabaseVersion2 폴더에 저장된 데이터베이스로 테스트합니다.

    예를 들어 다음 명령줄 문은 c:\LocalDatabaseVersion2\ToDo.sdf에서 에뮬레이터로 버전 2 데이터베이스 파일을 복사합니다.

    ISETool.exe rs xd 77a80316-384d-40dc-a8c3-c4054676e85c "C:\LocalDatabaseVersion2"
    

    GUID 값은 앱 매니페스트 파일에서 확인된 앱의 Product ID에 해당합니다. 앱의 Product ID가 이 예제에서 사용된 ID와 다를 수도 있습니다.

    버전 2 데이터베이스로 버전 3의 앱을 시작하면 버전 2 기준선으로 저장한 작업만 표시됩니다.

    AP_Con_LocalDatabaseUpdate_Baseline2

이 섹션에서는 격리된 저장소 탐색기를 사용하여 앱과 연결된 로컬 폴더 컨테이너를 지웁니다. 이전 버전의 데이터베이스 스키마로 앱을 테스트하는 동안 단말기에 이전 버전의 데이터베이스가 없는 새 고객의 환경을 테스트할 수도 있습니다. 격리된 저장소 탐색기를 사용하여 데이터베이스를 제거하는 것이 에뮬레이터를 다시 시작하거나 단말기에서 앱을 제거하는 것보다 편리합니다.

팁팁:

명령 창(Cmd.exe)에서 격리된 저장소 탐색기를 사용하는 경우 위쪽 및 아래쪽 화살표 키를 사용하여 명령 기록을 탐색하고 이전 명령에 신속하게 액세스하고 이를 편집합니다.

빈 폴더를 만들려면

  1. 기준선 데이터베이스 폴더 중 하나(예: LocalDatabaseVersion2)를 복사합니다.

  2. 폴더 이름을 LocalDatabaseEmpty로 바꿉니다.

  3. 로컬 데이터베이스 파일이 포함된 폴더로 이동합니다. 예를 들면, c:\LocalDatabaseEmpty입니다.

  4. ToDo.sdf라는 로컬 데이터베이스 파일을 삭제합니다.

  5. 이제 빈 로컬 폴더의 스냅숏을 만들었습니다. 에뮬레이터나 단말기의 앱에 이 폴더를 복원하면 앱의 로컬 폴더에서 로컬 데이터베이스 파일이 제거됩니다.

로컬 데이터베이스를 제거하려면

  • LocalDatabaseEmpty 폴더에 캡처된 빈 로컬 폴더를 복원합니다. 이 연습 데이터베이스 업데이트 테스트의 앞부분에서 설명한 프로세스와 유사한 프로세스를 사용합니다.

    예를 들어 다음 명령줄 문은 c:\LocalDatabaseEmpty에서 에뮬레이터로 빈 로컬 폴더를 복사합니다.

    ISETool.exe rs xd 77a80316-384d-40dc-a8c3-c4054676e85c "C:\LocalDatabaseEmpty"
    

    GUID 값은 앱 매니페스트 파일에서 확인된 앱의 Product ID에 해당합니다. 앱의 Product ID가 이 예제에서 사용된 ID와 다를 수도 있습니다.

    다음 이미지는 새로 설치를 시뮬레이션하여 LocalDatabaseEmpty 폴더를 복원한 후 표시되는 앱 버전 3 모양을 보여 줍니다.

    AP_Con_LocalDatabaseUpdate_Empty

    이제 로컬 데이터베이스 업데이트 연습을 완료했습니다.

표시: