WindowsPhone7でデータベースを利用する(WP7) その1


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]属性を利用するためにそれぞれ追加しています。

1
2
using System.Data.Linq;
using System.Data.Linq.Mapping;

DBのテーブルを作成する

データベースを管理する為、DataContextクラスを継承したクラスを作成します。
作成するデータベースのテーブル情報はこの作成したクラスに保持することになります。

以下のデータベースを管理するために作成した、MyDataContextクラスのソースコードを見てみましょう。

■MyDataContext.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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ボタンが押されたときには、メモ帳のタイトルとメモ内容をデータベースに保存しています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 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のサンプル

1
var hoge = from AAA in BBB where AAA._val == "hoge" selet AAA;

上記サンプルの場合、BBBというテーブルから取得したレコードのうち、_valの値がhogeのデータを抽出する。

以下のサンプルコードは、OPENボタンが押下されたときの処理です。
OPENボタンが押されたときには、メモ帳のタイトルとメモ内容をデータベースに保存しています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    // 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ボタンを押下すると
入力した名前に紐付いたメモの内容が表示されます。

One Comment