SQLiteにアクセスするコードの例
実際にSQLiteにアクセスするコードの例をいくつか紹介しておきましょう。とはいうものの、普通にEntity Framework Coreを使っているだけのコードです。お好みであれば、ADO.NETでも書けます(ArticleDatabase.csの末尾を参照)。コードの全体は、SQLiteSampleプロジェクトをご覧ください。
データクラス
このアプリで扱っているデータを次のコードに示します。ここで、ArticleIdプロパティは、Entity Framework Coreのルールによって主キーになります。
public class Article { public int ArticleId { get; set; } // 主キー public string Title { get; set; } public string Url { get; set; } }
データを追加する
データクラスのインスタンスを作り、それに主キー以外の値をセットしてから、Entity Framework CoreのAddメソッドに渡します。主キーの値は自動採番されます。Entity Framework CoreのSaveChangesAsyncメソッドを呼び出すと、データベースに反映されます。Addメソッドの返値のEntityプロパティに、実際に挿入されたデータオブジェクトが返ってきます(次のコード)。なお、SQLiteでは事前に主キーの値もセットできますが、その場合は既存データと衝突する可能性が出てきます。
async Task<Article> InsertDataAsync(Article article) { // 新規データを追加(自動採番) using (var context = new ArticleContext()) { var newEntry = context.Articles.Add(new Article { Title = article.Title, Url = article.Url, }); await context.SaveChangesAsync(CancellationToken.None); return newEntry.Entity; // 自動採番されたArticleIdがセットされたデータ } }
データをすべて取得する
データの全件を取得するには、Entity Framework CoreのDbContextのArticlesプロパティから取り出して、メモリー上のコレクションに移しかえればよいです(次のコード)。絞り込みたいときは、Articlesプロパティに対してLINQを使います(次の更新する例を参照)。ただし、Articlesプロパティそのものをローカル変数などにキャッシュしておいても、using句を抜けると無効になってしまいますので注意してください。
public static ObservableCollection<Article> ArticlesList { get; private set; } public static async Task<ObservableCollection<Article>> LoadAsync() { using (var context = new ArticleContext()) { ArticlesList = new ObservableCollection<Article>(await context.Articles.ToListAsync()); return ArticlesList; } }
データを更新する
更新対象のデータをデータベースから取得してきて、そこに変更を加えたら、Entity Framework CoreのSaveChangesAsyncメソッドを呼び出すだけです(次のコード)。このサンプルアプリでは同時実行制御を考慮していません。
async Task<Article> UpdateDataAsync(Article original, Article newData) { // 既存データの更新 using (var context = new ArticleContext()) { // データベースから更新対象のデータを取ってくる var targetItem = await context.Articles.SingleAsync(m => m.ArticleId == original.ArticleId); // 更新対象のデータを書き換え targetItem.Title = newData.Title; targetItem.Url = newData.Url; // データベースに反映 await context.SaveChangesAsync(CancellationToken.None); return targetItem; } }