SQLite Windows 10の準備をする(ユニバーサルアプリプラットフォーム)

みなさん、こんにちは!



Windows Phone 8.0 Silverlight、Windows Phone 8.1、Windows 8.1、および現在はWindows 10 UAPでもSQLiteを操作するための小さなライブラリについてお話します。 図書館はもう1年以上前から存在しています。 彼女との問題はずっと発生していなかったので、彼女について他の人に伝えることができると思います。



なんでこんなこと?

Windows Phone 8.0 Silverlight、Windows Phone 8.1、Windows 8.1のフレームワーク内のライブラリは1年以上続きました。 質問は次のとおりです。なぜ私はそれについて話すことにしたのですか? 実際のところ、今がWindows 10向けにアプリケーションを移植するときですが、公式のSQLite SDKはまだありません。

Windows Phone 8 、 Windows Phone 8.1 、 Windows 8 、およびWindows 8.1用のSDKは次のとおりです。 しかし、 Windows 10には対応していません。

そして、ほとんどの場合、Windows 10がリリースされるまでそうなりません。したがって、このライブラリを確認することは理にかなっています。



行こう

ライブラリはSQLite.WinRTと呼ばれます 。



私はその100%著者ではありません。 インターネットをさまよう多くのコードをまとめました。 したがって、私が何らかの形であなたの著作権を侵害していると思われる場合は、お知らせください-同意します。



ソースコードはこちらにあります 。

NuGetを使用してライブラリをインストールできます。 5つのパッケージがあります。



コンパイルを成功させるには、すべてのCPUを取り除き、x86、x64、ARMなどのプラットフォームごとにプロジェクトを個別にアセンブルする必要があります。



Windows 10 UAPアプリケーションの場合、次のSDKへのリンクを追加する必要があります。



Windows 8.1アプリケーションの場合、次のSDKへのリンクを追加する必要があります。



Windows Phone 8.1アプリケーションの場合、次のSDKへのリンクを追加する必要があります。



Windows Phone 8.0アプリケーションの場合、次のSDKへのリンクを追加する必要があります。





ライブラリの使用方法は?

たとえば、次のクラスが必要です。

public sealed class DatabaseContext : BaseDatabaseContext { private DatabaseContext(SQLiteConnection connection): base(connection) { } public async static Task<DatabaseContext> CreateContext() { const string dbName = "db.sqlite"; var folder = CorePlatform.Current.LocalFolder; var connectionString = new SQLiteConnectionString(Path.Combine(folder, dbName), true); var connection = SQLiteConnectionPool.Shared.GetConnection(connectionString); var ctx = new DatabaseContext(connection); await ctx.CreateSchemeAsync(); await ctx.UpdateSchemeAsync(); return ctx; } public IEntityTable<Item> Items { get { return provider.GetTable<Item>(); } } public IEntityTable<Category> Categories { get { return provider.GetTable<Category>(); } } } [Table("Items")] public class Item { [PrimaryKey, AutoIncrement] public int ItemID { get; set; } public int CategoryID { get; set; } public string Title { get; set; } } [Table("Categories")] public class Category { [PrimaryKey, AutoIncrement] public int CategoryID { get; set; } public string Name { get; set; } }
      
      





レコードを追加

 var category = new Category(); category.Name = "category"; await db.Categories.InsertAsync(category);
      
      





レコード更新

 category.Name = "category2"; await db.Categories.UpdateAsync(category);
      
      





主キーを除くすべてのフィールドが更新されます。

本当に必要な場合は、次のようにできます。

 var count = db.Categories .Update() .Set(t => t.Name).EqualTo("test name") .Where(t => t.CategoryID).IsBetweenAnd(3, 4) .Execute();
      
      





この場合、それだけが更新されます。

レコードを削除

 var count = db.Items.Delete() .Where(t => t.CategoryID).IsLessThanOrEqualTo(3) .And(t => t.Title).IsEqualTo("item0") .Execute();
      
      





または:

 var category = ...; await db.Categories.DeleteAsync(category);
      
      





データサンプリング

そして、ここでLINQが役立ちます:

 var query = from c in db.Categories join i in db.Items on c.CategoryID equals i.CategoryID select i; var items = await query.ToListAsync();
      
      





データ移行

気配りのある読者は2つの興味深い呼び出しに気付きました。

 await ctx.CreateSchemeAsync(); await ctx.UpdateSchemeAsync();
      
      





最初は、宣言されたコンテキストプロパティに基づいてテーブルを作成または更新します。 テーブル内の列は追加のみ可能です。 削除できません。

2番目は、バージョンがデータベースバージョンよりも小さい移行のリストを起動します。

移行は次のように宣言されます。

  [DatabaseUpdate(typeof(DbChangeset1))] [DatabaseUpdate(typeof(DbChangeset2))] [DatabaseUpdate(typeof(DbChangeset3))] [DatabaseUpdate(typeof(DbChangeset4))] public sealed class DatabaseContext : BaseDatabaseContext { ... }
      
      





移行の例:

  public class DbChangeset1 : IDatabaseChangeset { public int Version { get { return 1; } } public void Update(IEntityProvider provider) { //     ,     . } }
      
      





そのようなもの。 詳細については、単体テストをご覧ください。



そして今、私はあなたのコメント、提案、異議に耳を傾ける準備ができています。



All Articles