WindowsPhone7.1(Mango)へのバージョンアップで、
アプリケーションが保有する分離ストレージ内にデータベースを持つことが出来るようになりました。
このデータベースには、直接SQL文を入力するなどしてアクセスすることは出来ず、LINQ to SQLランタイムを経由したアクセスをする必要があります。
LINQ to SQLとは、LINQ(Language INtegrated Query,統合言語クエリと呼ばれる標準化されたデータ問い合わせ機能)を用いたSQLデータベースへのアクセスサポート機能です。LINQ to SQLを利用することで、コレクションフレームワークへのアクセスのように、データベースにアクセスすることが可能になります。
LINQの詳細についてはコチラを参照下さい。.NETの記事ですが参考になります。
本エントリでは、簡易なメモ帳アプリのサンプルを利用しながら、データベースの使用方法を解説していきます。
その1では、DBの利用方法全般と、SQL文の「insert」「select」についてを紹介しています。
その2では、残りのSQL文にあたる、updateやdelete、group byなどについても触れていこうと思います。
参照を追加する
LINQ to SQLを利用するためには、using属性にSystem.Data.Linqを追加する必要があります。
しかし、System.Data.Linqはプロジェクト作成後の標準環境では、プロジェクトから参照されておらずエラーになってしまいます。
そのため、以下手順に従い、System.Data.Linqに参照をするよう設定します。
参照を設定した後に以下のusing属性を追加します。
LinqはDataContextクラスを継承するために、Mappingは[Table]属性[Column]属性を利用するためにそれぞれ追加しています。
using System.Data.Linq; using System.Data.Linq.Mapping;
DBのテーブルを作成する
データベースを管理する為、DataContextクラスを継承したクラスを作成します。
作成するデータベースのテーブル情報はこの作成したクラスに保持することになります。
以下のデータベースを管理するために作成した、MyDataContextクラスのソースコードを見てみましょう。
■MyDataContext.cs
public class MyDataContext : DataContext { // コンストラクタに"isostore:/<name>.sdf"を渡す public MyDataContext() : base("isostore:/MyDB.sdf") { } // 自由に名称を設定できるコンストラクタ public MyDataContext(string name) : base(name) { } public Table<SampleRecords> records; }
1行目、4行目にコンストラクタを用意しています。
コンストラクタで、DBの名前を継承元のクラスのコンストラクタに渡し、DBを作成しています。
また、15行目ではTableクラスにSampleRecordsクラスを指定しています。
SampleRecordsクラスはテーブル情報として作成したクラスです。
SampleRecordsクラスの詳細は以下のソースコードの通りです。
■MyDataContext.cs
[Table] public class SampleRecords { // プライマリーキーのカラム [Column(IsPrimaryKey = true, IsDbGenerated=true)] public int _ID { get; set; } // 名前入力用のカラム(not null) [Column(CanBeNull = false)] public string _name { get; set; } // テキストデータ入力用のカラム [Column] public string _data { get; set; } }
1行目で、SampleRecordsクラスがTableを定義したクラスであることを明示しています。
5行目のように、クラス内に作成した各プロパティにColumn属性を付与することで、カラムとして定義することができます。
[Colmun]属性のプロパティ詳細については、リンク先(ColumnAttributeクラスのプロパティ欄)を参照ください。
データベースを管理するためにDataContextクラスを継承したクラスを作成した後には忘れずにMainPageで利用するための設定を行いましょう。
CreateDatabaseメソッドを呼び出す事で、データベースを作成することができます。
本エントリのサンプルでは、下記の通りMainpageのコンストラクタ内で呼び出しています。
■MainPage.xaml.cs
public partial class MainPage : PhoneApplicationPage { MyDataContext db= null; // コンストラクター public MainPage() { InitializeComponent(); // Databaseを作成する db = new MyDataContext(); // DBの存在チェック if (!db.DatabaseExists()) { db.CreateDatabase(); } // 省略....
12行目にて、DatabaseExistsメソッドでDBの存在チェックを行い、DBが未作成であれば、14行目の通りにCreateDatabaseメソッドを呼び出してデータベースを作成しています。
データの入出力を行う
最後に、上記のクラスを利用し、データベースへのデータ入出力をおこなう方法を紹介します。
まず、データ入力の方法です。
データベースにデータを入力するためには、TableクラスのInsertOnSubmitメソッドに挿入するデータを引き渡し、DataContextクラスのSubmigChangesメソッドを呼び出す必要があります。
SubmitChangesメソッドを呼び出すことで、DBへの変更点を反映しています。
以下のサンプルコードは、SAVEボタンが押下されたときの処理です。
SAVEボタンが押されたときには、メモ帳のタイトルとメモ内容をデータベースに保存しています。
// save button private void button1_Click(object sender, RoutedEventArgs e) { // メモの名前入力欄の入力チェック if (textBox1.Text == "") { textBox2.Text = "Error! input Records Name."; return; } /* DBにデータを入力する */ // Insertデータの作成 SampleRecords mRecord = new SampleRecords {_name = textBox2.Text,_data = textBox1.Text}; // Insert db.records.InsertOnSubmit(mRecord); // DBの変更を反映 db.SubmitChanges(); }
次に、データの出力方法です。
データベースからデータを取得するためには、LINQを利用する必要があります。
LINQの簡単な文法は、以下の通りです。
■LINQのサンプル
var hoge = from AAA in BBB where AAA._val == "hoge" selet AAA;
上記サンプルの場合、BBBというテーブルから取得したレコードのうち、_valの値がhogeのデータを抽出する。
以下のサンプルコードは、OPENボタンが押下されたときの処理です。
OPENボタンが押されたときには、メモ帳のタイトルとメモ内容をデータベースに保存しています。
// open button private void button2_Click(object sender, RoutedEventArgs e) { /* textBox1(メモの名前入力欄)の値でDBに問い合わせを行う */ // LINQを利用した問い合わせ var query = from SampleRecords sr in db.records where sr._name == textBox2.Text select sr; // 問い合わせ結果を表示する foreach (var v in query) { textBox1.Text = v._data; } } }
本エントリのサンプル
本エントリで作成したのは、簡易メモアプリです。
上側の入力欄にメモの名前、下側の入力欄にメモを入力します。
入力後、Saveボタンを押下するとデータベースに保存されます。
任意の操作後、メモの名前欄にデータベースに保存済みの名前を入力し、Openボタンを押下すると
入力した名前に紐付いたメモの内容が表示されます。