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