チュートリアル: Windows Phone のローカル データベース アプリケーションを更新する

2012/02/09

Windows Phone OS 7.1 では、アプリケーションの分離ストレージ コンテナー内に存在するローカル データベースにリレーショナル データを格納できます。アプリケーションが高度になると、デバイスにアプリケーションを配置した後にデータベースのスキーマの変更が必要になる場合があります。スキーマ更新のほとんどに、DatabaseSchemaUpdater クラスを使用できます。DatabaseSchemaUpdater では、列、インデックス、テーブル、および関連付けのローカル データベースへの追加をアプリケーション更新の一部として行えます。このチュートリアルでは、ローカル データベース サンプルのアプリケーションを例に使用して、ローカル データベースを更新する方法を説明します。Windows Phone アプリケーションでのローカル データベースの使用の詳細については、「Windows Phone のローカル データベースの概要」を参照してください。

注注:

単なる列やインデックス、テーブルの追加を超える幅広い変更が必要なローカル データベースの場合は、新しいデータベースを作成して、古いデータベースから新しいデータベースへデータを移行しなければならない可能性があります。詳細については、「Windows Phone のローカル データベース移行の概要」を参照してください。

このチュートリアルでは、ローカル データベース サンプルを 2 度更新します。最初の更新では、各タスクの優先順位を保存するための列を追加します。2 度目の更新では、Items テーブルにインデックスを追加します。チュートリアルの各段階を終えた後、分離ストレージ エクスプローラーを使用して、以前のバージョンのデータベースからの更新をテストします。Isolated Storage Explorer の詳細については、「方法: 分離ストレージ エクスプローラー ツールを使用する」を参照してください。

このチュートリアルを完了した後の更新後のローカル データベース サンプルは、次の例のようになります。

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. エミュレーターまたはデバイスで、アプリケーション バーの [add] ボタンをタップして、アプリケーションにいくつかのタスクを追加します。アプリケーションの各ピボット ページでタスクを表示するには、[Home]、[Work]、および [Hobbies] の各カテゴリでタスクを追加します。

    ヒントヒント:

    Windows Phone エミュレーターを使用している場合は、Page Up キーを押して、キーボードでテキスト値を入力します。

    次のイメージに、[home task]、[work task]、[hobby task] の 3 つのタスクを持つ、バージョン 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 つ目のバージョンのアプリケーションとローカル データベース スキーマを準備します。バージョン 2 では、タスクの優先順位に基づいて各タスクの色を変更できます。

この機能を実装するために、以下のファイルを更新または追加します。

  • Model\ToDoDataContext.cs: このファイルを更新して、優先順位のための新しい列を定義します。

  • ViewModel\ToDoViewModel.cs: このファイルを更新して、新しいタスクのための有効な優先順位のリストを提供します。

  • NewTaskPage.xaml and NewTaskPage.xaml.cs: このファイルを更新して、新しいタスクに関連付ける優先順位を指定するための ListPicker コントロールを追加します。

  • PriorityToColorConverter.cs: このファイルを追加して、タスクの優先順位を SolidColorBrush オブジェクトに変換します。これを、メイン ページの UI 内に表示されるタスクにバインドできます。

  • 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 で、categoriesListPicker のすぐ下にある ContentPanel という名前の StackPanel に次のコードを追加します。

    <!-- 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 で、ToDoListBoxItemTemplate という名前の DataTemplate の上にある phone:PhoneApplicationPage.Resources 要素に次の要素を追加します。

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

    このコードは、メイン ページに PriorityToColorConverter をリソースとして追加します。

  10. MainPage.xamlToDoListBoxItemTemplate という名前の DataTemplate 内で、TextBlock を次のように更新して、Foreground プロパティを指定します。

    <!-- 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;
    
    

    これは、以下の手順の 1 つで DatabaseSchemaUpdater オブジェクトを作成するために使用されます。

  12. ファイル App.xaml.cs で、App クラスに次のコードを追加します。

    // The current version of the application.
    public static int APP_VERSION = 2;
    
    
  13. App.xaml.cs で、db という名前の ToDoDataContextusing ステートメントを次のステートメントに置き換えます。

    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 Marketplace で更新した場合、更新されるのはアプリケーション コードだけです。アプリケーション更新処理では、分離ストレージには変更は加えられません。

データベースの更新をテストするには

  1. [ビルド] メニューの [リビルド] をクリックして、ソリューションを再度ビルドします。Visual Studio Express に [ビルド] メニューが表示されない場合は、[ツール] メニューの [設定] をクリックし、[上級者用の設定] を選択して、このメニューを有効にします。

  2. F5 キーを押してデバッグを開始します。これにより、新しいバージョンのアプリケーションがエミュレーターまたはデバイスに展開されます。

    注注:

    分離ストレージ エクスプローラーでアプリケーションの分離ストレージ コンテナーにコピーするには、アプリケーションの少なくとも 1 つのインスタンス (同じ Product ID を持つ) がエミュレーター上またはデバイス上に存在する必要があります。デバッガーを実行すると、この条件が満たされます。

  3. [デバッグ] メニューの [デバッグの停止] をクリックします。エミュレーターを閉じたり、デバイスの電源を抜いたりしなでください。これによりアプリケーションが閉じられ、分離ストレージ内にあるローカル データベース ファイルのコントロールが解放されます。

  4. 分離ストレージ エクスプローラーを使用して、エミュレーターまたはデバイスの LocalDatabaseVersion0 フォルダーからバージョン 0 のデータベースを復元します。詳細については、「方法: 分離ストレージ エクスプローラー ツールを使用する」を参照してください。次の例は、バージョン 0 のデータベース ファイルを c:\LocalDatabaseVersion0\IsolatedStore\ToDo.sdf からエミュレーターにコピーします。

    重要な注重要な注:

    データベースを正常に復元するために、このコマンドを実行するときには、必ずアプリケーションが (デバッガーでも、デバッガーなしでも) 実行中でないことを確認してください。アプリケーションが廃棄された場合は、デバイスが [スタート] に移動するまで [戻る] ボタンを押し続けて、そのアプリケーション スタックからの削除も行う必要がある可能性があります。

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

    GUID 値は、アプリケーション マニフェエスト ファイルに含まれているアプリケーションの Product ID に対応しています。アプリケーションの Product ID は、この例で使用されている ID とは異なる場合があります。

  5. これでアプリケーションが、Windows Phone Marketplace の更新をシミュレートできる状態になりました。新しいバージョンのアプリケーションをバージョン 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. エミュレーターまたはデバイスで、アプリケーション バーの [add] ボタンをタップして、アプリケーションにさまざまな優先順位と完了状態を持つ新しいタスクをいくつか追加します。必要であれば、新しいタスク用の空間を作るために、バージョン 0 のベースラインからタスクを削除します。

    次のイメージは、バージョン 0 から復元された一連のタスクと、優先順位のためのアプリケーションの新機能を見せる一連の新しいタスク、[task priority 1]、[task priority 2]、および [task 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 では、データベースへのセカンダリ インデックスの追加と、複数の更新経路を考慮したデータベース更新ロジックの準備を行う方法を示します。

重要な注重要な注:

ユーザーがアプリケーションのすべての更新をインストールするとは限りません。アプリケーションの起動時に、デバイスのデータベース ファイルが以前のいずれかのアプリケーション バージョンである可能性があることを考慮する必要があります。

バージョン 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 で、ToDoItem クラスの [Table] 属性のすぐ下に次の LINQ to SQL マッピング属性を追加します。

    // 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 という名前の ToDoDataContextusing ステートメントを次のように更新します。

    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 フォルダーに保存されているデータベースで、このチュートリアルの前の方の「データベース更新のテスト」で説明したプロセスを使用して、テストを行います。

    たとえば、次のコマンドライン ステートメントは、バージョン 0 のデータベース ファイルを c:\LocalDatabaseVersion0\IsolatedStore\ToDo.sdf からエミュレーターにコピーします。

    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 フォルダーに保存されているデータベースで、このチュートリアルの前の方の「データベース更新のテスト」で説明したプロセスを使用して、テストを行います。

    たとえば、次のコマンドライン ステートメントは、バージョン 2 のデータベース ファイルを c:\LocalDatabaseVersion2\IsolatedStore\ToDo.sdf からエミュレーターにコピーします。

    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. ベースライン データベース フォルダーの 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

    これで、ローカル データベース更新のチュートリアルが終わりました。

表示: