WindowsストアアプリでSQLiteを用いたローカルデータベースの利用 〜実装編〜

Microsoft Surfaceアメリカ等で予約開始されましたね^^
僕もほしいですが,日本語キーボードじゃないのと輸入するのに税金とかかかりそうなので,日本モデルを待とうと思ってます.
あと,キーボードの色も付属だと選択できないみたいですし…
(ちなみにセットの方が安い)

さてさて,前回の続きで,今回は実装編です.
前回は,SQLiteを使えるようにしました.
今回は実際にSQLiteを使ってローカルデータベースを構築します.
開発言語として,XAML+C#を用います

では,説明します.

まずは,Visual Studio 2012 を起動しましょう
初めての起動時には,どの言語で開発をしますか?と聞かれると思うので,今回はわかりやすくC#を選択しましょう

ファイル新規作成プロジェクトを選び,テンプレートVisual C#Windows ストア新しいアプリケーション(XAML)を選び,プロジェクト名を入力してOKを押します

※今回は,SQLiteAppとしました
まず,MainPage.xamlMainPage.xaml.csを開きましょう

MainPage.xamlのGrid内にListViewコントロールを追加します(下はわかりやすくGrid部分の記述もしています.)

<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
    <ListView x:Name="Food_listview" Width="500" HorizontalAlignment="Center" VerticalAlignment="Center" Header="食べ物リスト"/>
</Grid>

次に,前回作成したsqlite3.dllをプロジェクトに埋め込みましょう.
ソリューションエクスプローラから自分のプロジェクトを右クリックして,追加既存の項目を選びます

そして,作成したsqlite3.dllを選択します.
場所は,C:\sqliteにあると思います.

追加したら,sqlite3.dllプロパティを開き,出力ディレクトリにコピーの値を常にコピーするに変更しましょう



次は,SQLiteを用いるために,オンラインからパッケージを追加します.
参照設定を右クリックし,NuGetパッケージの管理を選びます

オンラインを選び,右上の検索欄にsqlite-netと入力し,sqlite-
net
をインストールします



続いて,参照設定を右クリックし,参照の追加を押します

Windows拡張にあるMicrosoft Visual C++ Runtime Packageにチェックを入れ,OKを押します

このままだと,x86で動作するかx64で動作するかわからず,今追加したC++ Runtimeがエラーを起こします.
なので,明示的にプロセッサを指定する必要があります.
ビルド構成マネージャーを押します

アクティブ ソリューション プラットフォームAny CPU からx86に変えます.

これで,全て設定は完了です.
データベース部分を実装したいと思います


まずは,SQLiteを参照します

using SQLite;

次に,このアプリがロードし終わったときに,データベースを作成するようにします.
コンストラクタ部分にLoadedイベントを追加します

public MainPage()
{
    this.InitializeComponent();
    Loaded += MainPage_Loaded;
}

データベースのテーブルを用意するため,Foodクラスを用意します

public class Food
{
    // 主キー,自動連番
    [AutoIncrement, PrimaryKey]
    public int Id { get; set; }

    // カラムの型と名前
    public string Name { get; set; }
    public int Price { get; set; }
    public int Calorie { get; set; }

    // 出力形式
    public override string ToString()
    {
        return string.Format("商品名:{0}\t価格:{1}円\tカロリー:{2}kcal", Name, Price, Calorie);
    }
}

Loadedイベント内を実装します.

void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    // データベース保存先と,データベースファイルの名前を決める
    var dbpath = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "FoodList.db");
    // dbpathで指定したデータベースファイルに,接続する
    using (var db = new SQLite.SQLiteConnection(dbpath))
    {
        // テーブルを作成
        db.CreateTable<Food>();
        // トランザクション処理
        db.RunInTransaction(() =>
            {
                // レコードの作成
                db.Insert(new Food() { Name = "醤油ラーメン", Price = 500, Calorie = 700 });
                db.Insert(new Food() { Name = "きつねうどん", Price = 350, Calorie = 500 });
                db.Insert(new Food() { Name = "カレーライス", Price = 450, Calorie = 1000 });
                db.Insert(new Food() { Name = "ポテトチップス", Price = 200, Calorie = 600 });
            });
        // ListViewのソースに設定する
        Food_listview.ItemsSource = db.Table<Food>();
    }
}

これで,あとは実行すると以下のように実行されます.





参考にさせていただいたページ
http://timheuer.com/blog/archive/2012/05/20/using-sqlite-in-metro-style-app.aspx
http://timheuer.com/blog/archive/2012/06/05/howto-video-using-sqlite-in-metro-style-app.aspx