연습: Windows Phone의 로컬 데이터베이스 응용프로그램 업데이트

2012-02-09

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

참고참고:

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

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

이 연습을 완료한 후 업데이트된 로컬 데이터베이스 샘플은 다음 예제처럼 표시됩니다.

AP_Con_LocalDatabaseUpdate_Features

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

이 항목은 다음 섹션으로 이루어져 있습니다.

  1. 버전 0의 기준선 데이터베이스 만들기

  2. 버전 2 준비: 작업 우선 순위 추가

  3. 데이터베이스 업데이트 테스트

  4. 버전 2의 기준선 데이터베이스 만들기

  5. 버전 3 준비: 인덱스 추가, 여러 업그레이드 경로 고려

  6. 이전 데이터베이스 버전에서 버전 3 업데이트 테스트

  7. 새로 설치 테스트: 로컬 데이터베이스 제거

이 단원에서는 로컬 데이터베이스 샘플을 실행하고, 일부 작업을 데이터베이스에 추가한 다음 이 연습의 뒷부분에서 업데이트를 테스트하기 위해 데이터베이스 복사본을 저장합니다. 로컬 데이터베이스 샘플의 작동 방식에 대한 자세한 내용은 방법: Windows Phone의 로컬 데이터베이스 응용프로그램(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 폴더로 로컬 데이터베이스를 복사합니다. 자세한 내용은 방법: 격리된 저장소 탐색기 도구 사용을 참조하십시오. 다음 예제에서는 에뮬레이터에서 c:\LocalDatabaseVersion0\IsolatedStore\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 and 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 요소의 DataTemplate(ToDoListBoxItemTemplate) 위에 다음 요소를 추가합니다.

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

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

  10. MainPage.xamlDataTemplate(ToDoListBoxItemTemplate)에서 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 데이터베이스를 복원합니다. 자세한 내용은 방법: 격리된 저장소 탐색기 도구 사용을 참조하십시오. 다음 예제에서는 에뮬레이터에서 c:\LocalDatabaseVersion0\IsolatedStore\ToDo.sdf로 버전 0 데이터베이스 파일을 복사합니다.

    중요중요:

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

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

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

  5. 이제 새 버전의 응용프로그램이 데이터베이스 버전 0으로 실행되기 직전에 응용프로그램이 Windows Phone 마켓플레이스 업데이트를 시뮬레이션하는 상태입니다. 데이터베이스 업데이트 코드를 단계별로 실행하려면 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 폴더로 로컬 데이터베이스를 복사합니다. 자세한 내용은 방법: 격리된 저장소 탐색기 도구 사용을 참조하십시오. 다음 예제에서는 에뮬레이터에서 c:\LocalDatabaseVersion2\IsolatedStore\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\IsolatedStore\ToDo.sdf에서 에뮬레이터로 버전 0 데이터베이스 파일을 복사합니다.

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

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

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

    AP_Con_LocalDatabaseUpdate_Baseline0

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

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

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

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

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

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

    AP_Con_LocalDatabaseUpdate_Baseline2

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

팁팁:

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

빈 폴더를 만들려면

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

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

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

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

  5. 이제 빈 격리된 저장소 컨테이너의 스냅숏을 만들었습니다. 에뮬레이터나 단말기의 응용프로그램에 이 폴더를 복원하면 응용프로그램의 격리된 저장소 컨테이너에서 로컬 데이터베이스 파일이 제거됩니다.

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

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

    예를 들어 다음 명령줄 문은 c:\LocalDatabaseEmpty\IsolatedStore에서 에뮬레이터로 빈 격리된 저장소 컨테이너를 복사합니다.

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

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

    다음 이미지는 새로 설치를 시뮬레이션하여 LocalDatabaseEmpty 폴더를 복원한 후 응용프로그램 버전 3이 어떻게 표시되는지를 보여 줍니다.

    AP_Con_LocalDatabaseUpdate_Empty

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

표시: