windows ストアーアプリで sqlite を使ってみよう
DESCRIPTION
Room metro #14 大阪のセッション資料です。TRANSCRIPT
Windows ストアーアプリで
SQLite を使ってみよう
Room metro #142013/3/16 THU
青柳 臣一 @ShinichiAoyagi
青柳 臣一(あおやぎ しんいち)@ShinichiAoyagihttp://shinichiaoyagi.blogspot.jp/
自宅 吹田職業 C# やら VB やら WPF やら Silverlight やらで ソフトウエア開発 最近はスマホとかも
自己紹介
ファイル I/O API•System.IO 名前空間、 Windows.Storage 名前空間
•分離ストレージWindows.Storage.ApplicationData
セキュア•ドキュメント、ミュージック、ピクチャ、ビデオ
WinRT でのファイルアクセス
ファイルアクセスに関するものはみんな非同期
async / await バンザイ!!!
非同期
テキスト•タブ区切りとかカンマ区切りとか
XML•XElement 属が便利
独自形式•自分でがんばって作る
データベース
データ形式
本家•http://www.sqlite.org/•Download に Windows 、 Windows Phone 8 、 WinRT 用など各種あり
インストール•Visual Studio 2012 の「拡張機能と更新プログラム」sqlite で検索して “ SQLite for Windows Runtime”
•本家からダウンロードしたときは .zip → .vsix にリネーム
SQLite (1)
参照の追加•SQLite for Windows Runtime にチェック
プラットホーム•Any CPU はダメ
•x86 、 x64 、 ARM のどれかにする
SQLite (2)
sqlite3.dll•SQLite 本体はレガシーなネイティブ DLL
マネージドコードで使うには•DllImport とかでがんばる
•なんか使う→ NuGet の sqlite-net (他にもいろいろあ
るみたい)
SQLite (3)
sqlite-net•SQLite の薄いラッパー
•SQLite.cs と SQLiteAsync.cs の 2 つの C# ファイルのみ
sqlite-net (1)
テーブル定義
コネクション、テーブル作成、インサート
sqlite-net (2)class Person {
[PrimaryKey, AutoIncrement]public int Id { get; set; }
[MaxLength(20)]public string Name { get; set; }
}
using (var con = new SQLiteConnection(
Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "AdressBook.db")))
{con.CreateTable<Person>();con.Insert(new Person() { Name = " メトロ太郎 " });
}
シンプルなクエリー
受け取る型を定義してクエリー
sqlite-net (3)
var persons = con.Query<Person>("select * from Person where Id = 1");
class Result{
public string Name { get; set; }}
var names = con.Query<Result>("select Name from Person where Id = 1");
LINQ っぽくクエリー
全件取得して LINQ to Object で絞り込んでいるのでは無い!
Expression を遅延解釈して select * from “Person” where (“Id” = ?) limit 1
というクエリーを作っている
sqlite-net (4)
var person = con.Table<Person>().Where(x => x.Id == 1).First();
Execute 、 ExecuteScalar<T>
Update 、 Delete
sqlite-net (5)
con.Execute("update Person set Name='WindowsRT' where Id=1");
var person = con.Table<Person>().Where(x => x.Id == 1).First();person.Name = "Metro";con.Update(person);
非同期!sqlite-net (6)
var con = new SQLiteAsyncConnection(
Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path,"AdressBook.db"));
await con.CreateTableAsync<Person>();await con.InsertAsync(new Person() { Name = " メトロ太郎 " });
var person = await con.Table<Person>().Where(x => x.Id == 1).FirstAsync();person.Name = "Metro";await con.UpdateAsync(person);
await con.ExecuteAsync("update Person set Name='WindowsRT' where Id=1");
var persons = await con.Table<Person>().ToListAsync();
ローミング•http://blogs.msdn.com/b/windowsappdev_ja/archive/2012/07/25/roaming.aspx•Windows.Storage.ApplicationData.Current.RoamingFolder.Path に入れるだけ•使わない理由は無い
けど注意•SQLite はファイルをロックしない•依存関係のある複数のテーブルがあると内容が壊れるかも
→最初に RoamingFloder から LocalFolder にコピー。使い終わったら LocalFolder から RoamingFolder にコピー。とかすればいいんじゃないかな?
ローミング (1)
使う前に LocalFolder にコピー
使い終わったら RoamingFolder にコピー
ローミング (2)
try{ var foamingfile = await Windows.Storage.ApplicationData.Current.RoamingFolder.GetFileAsync("AdressBook.db"); await foamingfile.CopyAsync(Windows.Storage.ApplicationData.Current.LocalFolder);}catch (FileNotFoundException){}
var localfile = await Windows.Storage.ApplicationData.Current.LocalFolder.GetFileAsync("AdressBook.db");await localfile.CopyAsync(Windows.Storage.ApplicationData.Current.RoamingFolder);
アプリケーション パッケージの作成•「プロジェクト」-「ストア」-「アプリパッケージの作成」•http://msdn.microsoft.com/ja-jp/library/windows/apps/xaml/hh975357.aspx
パッケージの作成
準備•Remote Tools for Visual Studio 2012 Update 1
http://www.microsoft.com/ja-jp/download/details.aspx?id=30674
を入れる Windows ストアーアプリではありませんが
入ります!
リモートデバッグ•リモート側で Remote Debugger を起動•Visual Studio の「リモートコンピューター」で実行
変更はプロジェクトのプロパティの「デバッグ」
おまけ : Windows RT でリモートデバッグ