Windows Phone アプリケーションのデータベースのバージョンを管理する方法

Windows Phone OS 7.1 から、分離ストレージにデータベースを作成することができます。

データベースを使用するWindows Phone アプリケーション を作成している中で、何度かデータベースのアップデートをすることがあると思います。

今回の記事では、テーブルのアップデートを管理する方法について記述します。



Windows Phone でデータベースを作成するには、データコンテキストを構築して、データベースを作成します。

// データベースが存在しない場合は、作成する
using (WindowsPhoneDb mangoDb = new WindowsPhoneDb())
{
    if (!mangoDb.DatabaseExists())
    {
        // データベースの作成
        mangoDb.CreateDatabase();
    }
}

※ データベースの作成方法については、MSDN の" How to: Create a Basic Local Database Application for Windows Phone "を参照してください

これにより、アプリケーションはデータベースを作成します。


次に、Windows Phone でデータベースのスキーマのアップデートをおこなうには、まず現在のデータベースのバージョンを確認する必要があります。

データベースのバージョンやアップデートには、Microsoft.Phone.Data.Linq Namespace名前空間を参照します。

using Microsoft.Phone.Data.Linq;

Microsoft.Phone.Data.Linq Namespace名前空間を参照することで、DataContextCreateDatabaseSchemaUpdaterが追加されます。

このCreateDatabaseSchemaUpdaterクラスには、DatabaseSchemaVersionプロパティというのがあります。

DatabaseSchemaUpdater updater = mangoDb.CreateDatabaseSchemaUpdater();

// 現在のデータベースのスキーマのバージョンを取得する
int version = updater.DatabaseSchemaVersion;

このプロパティを使うことで、ローカルデータベースのスキーマのバージョンを取得することができます。

なお、スキーマのデフォルトバージョンは 0 となっています。


このバージョンを使うことで、Windows Phone のデータベースのアップデートを管理することができます。

using (WindowsPhoneDb mangoDb = new WindowsPhoneDb())
{
    if (!mangoDb.DatabaseExists())
    {
        // データベースの作成
        mangoDb.CreateDatabase();
    }
    else
    {
        DatabaseSchemaUpdater updater = mangoDb.CreateDatabaseSchemaUpdater();

        // 現在のデータベースのスキーマのバージョンを取得する
        int version = updater.DatabaseSchemaVersion;

        // 1回目のデータベースのアップデート
        if (version < 1)
        {
            UpdateDatabaseVersion1();
            // スキーマのバージョン番号をアップデートする
            updater.DatabaseSchemaVersion = 1;
            updater.Execute();
        }

        // 2回目のデータベースのアップデート
        if (version < 2)
        {
            UpdateDatabaseVersion2();
            // スキーマのバージョン番号をアップデートする
            updater.DatabaseSchemaVersion = 2;
            updater.Execute();
        }
    }
}

なお、スキーマのバージョン番号をアップデートするには、DatabaseSchemaVersionプロパティをインクリメントしていけば、大丈夫です。

updater.DatabaseSchemaVersion = 1;
updater.Execute();


では最後に、実際に分離ストレージにあるローカルデータベース内で、バージョンの管理はどのようにしているか確認します。

データベースの中身を確認するには、Microsoft SQL Server 2008 R2 Management Studio Express (SSMSE) を使います。

※ SSMSE については、前回の記事をご確認ください

作成したデータベースの中身を確認すると、テーブル内に __VERSION テーブルが存在しています。

この __VERSION テーブルを右クリックして プロパティ > 列 を指定して確認すると、SchemaVersion カラムとDetaUpdated カラムが存在します。

SchemaVersion カラムでは、スキーマのバージョン番号が管理されており、
DetaUpdated カラムでは、スキーマのバージョンをアップデートした日時が保存されています。

なお、 __VERSION テーブルのアップデート情報は、スタックされていきます。


以上で、Windows Phone アプリケーションでデータベースのバージョンを管理する方法になります。


ggった参考サイト
neue cc - はぢめてのWindows Phone 7でのデータベース(Linq to Sql)
http://neue.cc/2011/05/30_325.html

Sergey Barskiy's Blog - SQL CE in Mango–Updating the Schema
http://dotnetspeak.com/index.php/2011/07/sql-ce-in-mangoupdating-the-schema/

http://www.st-hatena.com/users/sa/samril/user_p.gifちょー調べました。
もしより良い方法がありましたら、Twitterでも、コメントでもくださいませませ。