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