WinRTでデヌタを操䜜したす。 パヌト2. SQLiteを䟋ずしお䜿甚しおデヌタベヌスを操䜜する

前のパヌトでは、アプリケヌションのファむルストレヌゞにアクセスする方法に぀いお説明したした。 ファむルストレヌゞに盎接アクセスできるため、ほがすべおの組み蟌みデヌタベヌスを䜿甚できたす。 これたで、SQLiteはおそらく最も人気のあるクロスプラットフォヌム組み蟌みデヌタベヌスです。 この点で、アプリケヌションを移怍するずきは、SQLiteを䜿甚する必芁がありたす。これに぀いおは、次に説明したす。



䞀般に、この蚘事はSQL Liteのむンストヌルおよび操䜜の指瀺により類䌌しおいるこずが刀明したした。



蚘事は説明したす

sutdiaの拡匵機胜をむンストヌルしたす。

プロゞェクトぞのSQLiteの远加

sqlite-netプロバむダヌの远加

linqプロバむダヌLinqToSql、EFのスタむルを介しおデヌタベヌスを操䜜する

SQLク゚リADO.NETのスタむルを介しおデヌタベヌスを操䜜する





デモプロゞェクトでは、蚘事で怜蚎される曞籍のリストを操䜜する非垞に簡単な䟋が蚘事に添付されおいたす。



Tim Heuerブログには、SQLiteサポヌトの远加方法に関する玠晎らしい蚘事がありたす。 ここで、SQLiteを远加する手順を怜蚎しおください。



スタゞオの準備。 拡匵機胜をむンストヌルしたす。



SQLiteを有効にする最も簡単な方法は、カスタム拡匵機胜をむンストヌルするこずです。 これを行うには、[ツヌル]メニュヌの[拡匵機胜ず曎新プログラム]を開きたす。

画像



拡匵機胜をむンストヌルした埌、スタゞオを再起動する必芁がありたす。これで、プロゞェクトのSQLiteラむブラリぞのリンクをプロゞェクトに远加できるようになりたす。



プロゞェクトぞのSQLiteの远加



最初に、SQLiteラむブラリぞのリンクを远加する必芁がありたすプロゞェクトを右クリック-参照を远加

画像



Microsoft Visual C ++ Runtime Packageリンクをチェックしおください。 このコンポヌネントは、SQLiteラむブラリによっお䜿甚されたす。 远加しない堎合、プロゞェクトは開始されお動䜜したすが、リンクを提䟛しない堎合、プロゞェクトはWindows App Certification Toolkitに合栌しないため、远加する必芁がありたす。



デフォルトでは、プロゞェクトはコンパむルされたせん。



プロゞェクトをコンパむルするには、Configuration Managerビルドメニュヌの最埌の項目でx86、x64たたはArmプラットフォヌムを遞択する必芁がありたす



画像



残念ながら、アプリケヌションをレむアりトするずきは、プラットフォヌムごずにプロゞェクトを個別にコンパむルする必芁がありたすが、玔粋なCにSQL Liteポヌトが衚瀺されるたで、Any CPUオプションでコンパむルするこずはできたせん。



この堎合、プロゞェクトプロパティで、プラットフォヌムおよびプラットフォヌムタヌゲットオプションの任意のCPUを返すこずができたす。



Linqプロバむダヌを远加する





.NETプロゞェクトにTim Heuer sqlite-netラッパヌを远加しお、LinqToSqlプロバむダヌず同じ方法でSQLiteを操䜜するこずにより、SQLiteの操䜜を倧幅に簡玠化できたす。 このラッパヌは、SQLではなくlinqを奜むナヌザヌに圹立ち、Windows Phoneからのアプリケヌションの移怍も簡玠化したす。



パッケヌゞマネヌゞャヌに粟通しおいる堎合は、次のコマンドでラッパヌをむンストヌルできたす。



Install-Package sqlite-net
      
      





ビゞュアルパッケヌゞマネヌゞャヌでの䜜業を垌望する堎合、パッケヌゞは、NuGetパッケヌゞの管理メニュヌプロゞェクトのコンテキストメニュヌプロゞェクトを右クリックで䜿甚可胜たたはスタゞオメニュヌの[ツヌル]-> [ラむブラリパッケヌゞマネヌゞャヌ]-> [゜リュヌションのNuGetパッケヌゞの管理]からむンストヌルできたす...



画像



キリル名の問題を解決したす。 ロシア語のナヌザヌ名


ナヌザヌ名はアプリケヌションの隔離されたストレヌゞのパスの䞀郚であり、小さなバグのため、sqlite-netはキリルパスを䜿甚できたせん。 キリル文字で名前が指定されおいるナヌザヌに察しお、アプリケヌションが機胜しない堎合がありたす。



Sqlite-netをむンストヌルするず、2぀のファむルがプロゞェクトに远加されたす



SQLite.cs

SQLiteAsync.cs



゚ラヌを修正するには、パブリックSQLiteConnectionクラスのコンストラクタヌ内のsqlite.netファむルstring databasePath、bool storeDateTimeAsTicks = falseで、行を倉曎したす



 var r = SQLite3.Open(DatabasePath, out handle);
      
      





に

 var r = SQLite3.Open16(DatabasePath, out handle);
      
      





これで、デヌタベヌスを操䜜する準備がすべお敎いたした。



次のコヌドを䜿甚しお、デヌタベヌスに接続できたす。



 using (var db = new SQLiteConnection(dbPath)) { //db code }
      
      





ここで、dbPathはファむルシステム内のデヌタベヌスぞのフルパスです。



 dbPath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "databasename.db");
      
      







sqlite-netを䜿甚するず、Linqプロバむダヌを䜿甚しお、ADO.NETのスタむルで䜜業できたす。 䞡方の点をもう少し怜蚎しおください。



sqlite-netプロバむダヌの远加





たずえば、デヌタベヌスに補品のリストを保存する必芁がありたす。 たず、察応するモデルを準備する必芁がありたす。



たずえば、自動むンクリメントず250文字のテキストフィヌルドを持぀䞻キヌを瀺す単玔な補品モデルを䜜成したす。



 public class Product { [PrimaryKey, AutoIncrement] public int ProductId { get; set; } [MaxLength(250)] public string Name { get; set; } }
      
      





デヌタベヌスを操䜜するための別個のDataLayerクラスがあるずしたす。 クラスコンストラクタヌで、デヌタベヌス接続文字列を䜜成したす。



 private readonly string dbPath; public DataLayer() { dbPath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "products.db"); }
      
      





このメ゜ッドの実行時にデヌタベヌスずProductテヌブルを䜜成するクラスにInitメ゜ッドを远加したす。



 public void Init() { using (var db = new SQLiteConnection(dbPath)) { db.CreateTable<Product>(); } }
      
      





このメ゜ッドが実行されるず、products.dbデヌタベヌスがロヌカルフォルダヌに䜜成されたす。 これは、他のプラットフォヌムで䜿甚できる通垞のsqliteデヌタベヌスになりたす。 任意のナヌティリティを䜿甚しおデヌタベヌスを衚瀺するこずもできたす。 たずえば、無料のSQLite Expert Personalを䜿甚しおこのデヌタベヌスを開くず、衚の図を芋るこずができたす。

画像



兞型的なシナリオでの䜜業の䟋をいく぀か考えおみたしょう。 たずえば、新しい補品を远加するためのコヌド



 public Product AddProduct(string name) { var product = new Product() {Name = name}; using (var db = new SQLiteConnection(dbPath)) { db.Insert(product); } return product; }
      
      





このメ゜ッドが実行されるず、ProductIdプロパティによっおデヌタベヌスから識別子がProductオブゞェクトに自動的に割り圓おられたす。



次のコヌドセクションは、遞択した識別子で補品を受け取りたす。



 public Product GetProductById(int productId) { using (var db = new SQLiteConnection(dbPath)) { return db.Table<Product>().FirstOrDefault(i => i.ProductId == productId); } }
      
      





盎接SQLク゚リを䜿甚しおレコヌドを取埗するこずもできたす。



 public Product GetProductById(int productId) { using (var db = new SQLiteConnection(dbPath)) { return db.Query<Product>("select * from product where ProductId=?", productId).FirstOrDefault(); } }
      
      





したがっお、同じ方法ですべおのレコヌドを取埗できたす。



 public List<Product> GetAllProducts() { using (var db = new SQLiteConnection(dbPath)) { return db.Table<Product>().ToList(); } }
      
      





ラッパヌのもう1぀の優れた機胜は、識別子によっお補品を削陀する機胜ですLinqToSQLにはありたせん。



 public void DeleteProduct(int id) { using (var db = new SQLiteConnection(dbPath)) { db.Delete<Product>(id); } }
      
      





曞籍のリストを操䜜する非垞に簡単な䟋を瀺す完党な䟋は、 ここからダりンロヌドできたす 。



SQLク゚リADO.NETのスタむルを介しおデヌタベヌスを操䜜する





Linqプロバむダヌの利䟿性にもかかわらず、堎合によっおは、たずえば既存のコヌドを移怍するずき、SQLク゚リを䜿甚しおデヌタベヌスを盎接操䜜する方が䟿利な堎合がありたす。 sqlite-netを䜿甚するず、デヌタベヌスを完党に操䜜しお、デヌタを返さない単玔なク゚リ、たたは耇雑なデヌタ型を返すデヌタを実行できたす。



次の䟋では、単玔なク゚リ、パラメヌタを䜿甚したク゚リ、および単玔なデヌタ型ずテヌブルを返すク゚リを実行する方法を芋おいきたす。



䟋ずしお、6.3で怜蚎したものず同様のものを怜蚎したす。 コンストラクタヌに接続文字列を䜿甚しお、デヌタを操䜜するためのDataLayerクラス



 private readonly string dbPath; public DataLayer() { dbPath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "products.db"); }
      
      





同様のテヌブル䜜成方法を怜蚎しおください。



 public void Init() { using (var db = new SQLiteConnection(dbPath)) { db.CreateCommand( @"CREATE TABLE ""Product""( ""ProductId"" integer primary key autoincrement not null , ""Name"" varchar(250) );" ).ExecuteNonQuery(); } }
      
      





堎合によっおは、入力匕数付きの芁求が必芁です。 この堎合、各パラメヌタヌのsqlク゚リで「」蚘号を䜿甚しお、無制限の数のパラメヌタヌを远加できたす。 たずえば、補品を名前で远加する方法の実装を考えおみたしょう。



 public void AddProduct(string name) { using(var db=new SQLiteConnection(dbPath)) { db.CreateCommand("INSERT INTO Product (Name) VALUES (?)", name).ExecuteNonQuery(); } }
      
      





堎合によっおは、ク゚リの結果ずしお単玔なデヌタ型を返す必芁がありたす。 したがっお、デヌタベヌス内の行数を返すク゚リは次のようになりたす。



 public int GetCount() { using (var db = new SQLiteConnection(dbPath)) { return db.CreateCommand("SELECT COUNT(ProductId) FROM Product").ExecuteScalar<int>(); } }
      
      





テヌブルを返す必芁がある堎合、レコヌドを取埗するための適切なモデルが必芁です。 この衚では、モデルは次のようになりたす。



 public class Product { public int ProductId { get; set; } public string Name { get; set; } }
      
      





これで、SQLリク゚ストを介しおデヌタベヌスからすべおのレコヌドを取埗できたす。



 public List<Product> GetAllProducts() { using(var db=new SQLiteConnection(dbPath)) { return db.CreateCommand("select * from product").ExecuteQuery<Product>(); } }
      
      







たずめ



ご芧のずおり、SQL Liteを䜿甚するこずは、SQL CEを操䜜するこずほど難しくありたせん。 したがっお、アプリケヌションのすべおのバヌゞョンで単䞀のクロスプラットフォヌムデヌタベヌスを䜿甚できたす。 11月の蚘事では、このラむブラリを䜿甚しおクロスプラットフォヌムアプリケヌションを䜜成する方法に぀いお説明したす。



PSキリル文字で問題を研究する問題の助け、アドバむス、解決策に぀いおVoldemarRingerずStasusに感謝したす。



All Articles