酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Windows PhoneでLINQ to SQLを使ってデータベースを作成する

Windows Phone OS 7.1からアプリケーションの分離ストレージ領域にローカルデータベースファイルを作成できるようになりました。アプリケーションからのデータベース操作はSQLは使用できません。LINQ to SQLを介してデータベース操作をおこないます。

基本的な使い方を習得する為に、Addボタンをタップするとエンティティを追加し、ListBox上のアイテムを選択するとエンティティを削除するアプリケーションを作成してみましょう。

今回はデータベースの作り方をやります。エンティティの追加と削除は次回にまたやりましょう。。

ローカルデータベースの機能を使用するには、参照の追加ダイアログから「Microsoft.Phone.Data.Linq」を選択して[OK]ボタンをクリックします。


データコンテキストとエンティティの定義

データコンテキストとエンティティの定義を行います。以下のクラスではデータのオブジェクトとデータベースのスキーマ間のマッピングを定義しています。

データコンテキストはデータベースそのものとマッピングされます。ここではSampleDataContextがデータベースとのマッピング定義となります。規定クラスのコンストラクタに分離ストレージ上のどの位置にデータベースを作成するのかURLを渡しています。

Table属性を付与したSampleItemクラスは、データベースの同名のテーブルとマッピングされ、エンティティクラスとして扱われます。

SampleItemクラスのIDプロパティとTimestampプロパティにはそれぞれColumn属性が付与され、データベースのテーブルの列とマッピングされます。中でもIDプロパティには、IsPrimaryKeyで主キーが設定されており、IsDbGeneratedには自動生成される値が入るかどうかが定義されています。

using System;
using System.Data.Linq;
using System.Data.Linq.Mapping;

namespace LinqToSqlTest {

    /// <summary>
    /// データベースの定義
    /// </summary>
    public class SampleDataContext : DataContext {
        public SampleDataContext()
            : base("isostore:/Hoge.sdf") { }

        /// <summary>
        /// 
        /// </summary>
        public Table<SampleItem> SampleTable;
    }

    /// <summary>
    /// テーブルのレコード定義
    /// </summary>
    [Table]
    public class SampleItem {

        /// <summary>
        /// プライマリキー(自動生成)
        /// </summary>
        [Column(IsPrimaryKey = true, IsDbGenerated = true, CanBeNull = false)]
        public int ID { get; set; }

        /// <summary>
        /// タイムスタンプ
        /// </summary>
        [Column]
        public DateTime Timestamp { get; set; }
    }
}

データベースの作成

MainPage.xamlへの遷移の完了時に、データベースが存在しているかどうかを確認して、なければデータベースを作成しています。

最初にSampleTableテーブルに格納されているデータを抽出して、ContetPanel上に配置しているListBoxコントロールのデータソースとして設定します。

using System;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows.Controls;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;

namespace LinqToSqlTest {
    public partial class MainPage : PhoneApplicationPage {
        // コンストラクター
        public MainPage() {
            InitializeComponent();
        }

        ObservableCollection<SampleItem> sampleIems = null;

        protected override void OnNavigatedTo(NavigationEventArgs e) {

            using (var db = new SampleDataContext()) {
                if (!db.DatabaseExists()) {
                    // データベースが存在していなければ作成する
                    db.CreateDatabase();
                }

                // SampleTableテーブルのレコードをすべて取得する
                var items = db.SampleTable.ToList<SampleItem>();

                // リストをObservableコレクション化する
                sampleIems = new ObservableCollection<SampleItem>(items);

                // ListBoxコントロールのソースとして設定する
                listBox.ItemsSource = sampleIems;
            }
        }
    }
}