windows ストアーアプリで sqlite を使ってみよう

18
Windows スススススススス SQLite ススススススス Room metro #14 2013/3/16 THU スス ス @ShinichiAoyagi

Upload: shinichiaoyagi

Post on 03-Dec-2014

8.433 views

Category:

Technology


4 download

DESCRIPTION

Room metro #14 大阪のセッション資料です。

TRANSCRIPT

Page 1: Windows ストアーアプリで SQLite を使ってみよう

Windows ストアーアプリで

SQLite を使ってみよう

Room metro #142013/3/16 THU

青柳 臣一  @ShinichiAoyagi

Page 2: Windows ストアーアプリで SQLite を使ってみよう

青柳 臣一(あおやぎ しんいち)@ShinichiAoyagihttp://shinichiaoyagi.blogspot.jp/

自宅 吹田職業  C# やら VB やら WPF やら Silverlight やらで   ソフトウエア開発   最近はスマホとかも

自己紹介

Page 3: Windows ストアーアプリで SQLite を使ってみよう

ファイル I/O API•System.IO 名前空間、 Windows.Storage 名前空間

•分離ストレージWindows.Storage.ApplicationData

セキュア•ドキュメント、ミュージック、ピクチャ、ビデオ

WinRT でのファイルアクセス

Page 4: Windows ストアーアプリで SQLite を使ってみよう

ファイルアクセスに関するものはみんな非同期

async / await バンザイ!!!

非同期

Page 5: Windows ストアーアプリで SQLite を使ってみよう

テキスト•タブ区切りとかカンマ区切りとか

XML•XElement 属が便利

独自形式•自分でがんばって作る

データベース

データ形式

Page 6: Windows ストアーアプリで SQLite を使ってみよう

本家•http://www.sqlite.org/•Download に Windows 、 Windows Phone 8 、 WinRT 用など各種あり

インストール•Visual Studio 2012 の「拡張機能と更新プログラム」sqlite で検索して “ SQLite for Windows Runtime”

•本家からダウンロードしたときは .zip → .vsix にリネーム

SQLite (1)

Page 7: Windows ストアーアプリで SQLite を使ってみよう

参照の追加•SQLite for Windows Runtime にチェック

プラットホーム•Any CPU はダメ

•x86 、 x64 、 ARM のどれかにする

SQLite (2)

Page 8: Windows ストアーアプリで SQLite を使ってみよう

sqlite3.dll•SQLite 本体はレガシーなネイティブ DLL

マネージドコードで使うには•DllImport とかでがんばる

•なんか使う→ NuGet の sqlite-net (他にもいろいろあ

るみたい)

SQLite (3)

Page 9: Windows ストアーアプリで SQLite を使ってみよう

sqlite-net•SQLite の薄いラッパー

•SQLite.cs と SQLiteAsync.cs の 2 つの C# ファイルのみ

sqlite-net (1)

Page 10: Windows ストアーアプリで SQLite を使ってみよう

テーブル定義

コネクション、テーブル作成、インサート

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 = " メトロ太郎 " });

}

Page 11: Windows ストアーアプリで SQLite を使ってみよう

シンプルなクエリー

受け取る型を定義してクエリー

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");

Page 12: Windows ストアーアプリで SQLite を使ってみよう

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();

Page 13: Windows ストアーアプリで SQLite を使ってみよう

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);

Page 14: Windows ストアーアプリで SQLite を使ってみよう

非同期!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();

Page 15: Windows ストアーアプリで SQLite を使ってみよう

ローミング•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)

Page 16: Windows ストアーアプリで SQLite を使ってみよう

使う前に 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);

Page 17: Windows ストアーアプリで SQLite を使ってみよう

アプリケーション パッケージの作成•「プロジェクト」-「ストア」-「アプリパッケージの作成」•http://msdn.microsoft.com/ja-jp/library/windows/apps/xaml/hh975357.aspx

パッケージの作成

Page 18: Windows ストアーアプリで SQLite を使ってみよう

準備•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 でリモートデバッグ