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

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ボタンを押下すると
入力した名前に紐付いたメモの内容が表示されます。

One Comment