はじめに
SQLiteを用いて、WPFで登録・削除可能なリストを作成します。
大量のデータを永続化させるには、データベースを用いると楽です。
SQLiteを用いてデータを永続化させる方法について説明したいと思います。
SQLiteを用いたサンプルアプリ外観
サンプルアプリクラス図
SQLite 導入手順
Visual Studio 2017
でSQLite
を使用したいときは、プロジェクトにSQLite
を追加する必要があります。
SQLite
は、NuGetパッケージ マネージャー
からプロジェクトに追加します。
https://www.nuget.org/packages/System.Data.SQLite/
以下はコマンドです。
Install-Package System.Data.SQLite -Version 1.0.108
SQLiteのデータべベースを生成する
以下のコードで実現できます。
SQLiteConnection
クラスに渡すString
型の変数は、SQLiteConnectionStringBuilder
クラスで作成するとよいでしょう。
[DataBaseManager.csの一部抜粋]
private static readonly string FileName = @"BookList.db"; private readonly string ConnectionString = null; private readonly string DataBaseFilePath = System.AppDomain.CurrentDomain.BaseDirectory + FileName; /// <summary> /// コンストラクタ /// </summary> public DataBaseManager() { var builder = new SQLiteConnectionStringBuilder() { DataSource = FileName }; ConnectionString = builder.ToString(); }
/// <summary> /// データベースを作成する /// </summary> public void CreateDataBase() { using (var connection = new SQLiteConnection(ConnectionString)) { // データベースに接続 connection.Open(); // コマンドの実行 using (var command = connection.CreateCommand()) { command.CommandText = "CREATE TABLE T_BOOKLIST(ID int PRIMARY KEY, Title string, Author string, Price int)"; command.ExecuteNonQuery(); } } }
データベースの特定テーブルの全データを取得する
public List<Book> GetDataBase() { var list = new List<Book>(); using (var connection = new SQLiteConnection(ConnectionString)) using (var command = connection.CreateCommand()) { try { // データベースの接続開始 connection.Open(); // SQLの設定 command.CommandText = @"SELECT * FROM T_BOOKLIST"; // SQLの実行 using (var reader = command.ExecuteReader()) { while (reader.Read() == true) { Int32.TryParse(reader["ID"].ToString(), out int id); Int32.TryParse(reader["Price"].ToString(), out int price); list.Add(new Book() { ID = id, Title = reader["Title"].ToString(), Author = reader["Author"].ToString(), Price = price }); } } } catch (Exception exception) { Console.WriteLine(exception.Message); throw; } } return list; }
データベースにデータを追加する
/// <summary> /// データベースにデータを追加する /// </summary> /// <returns></returns> public void AddDataBase(Book someBook) { var list = new List<Book>(); using (var connection = new SQLiteConnection(ConnectionString)) using (var command = connection.CreateCommand()) { try { // データベースの接続開始 connection.Open(); // SQLの設定 command.CommandText = @"INSERT INTO T_BOOKLIST (ID, Title, Author, Price) VALUES (@ID, @Title, @Author, @Price)"; command.Parameters.Add(new SQLiteParameter("@ID", someBook.ID)); command.Parameters.Add(new SQLiteParameter("@Title", someBook.Title)); command.Parameters.Add(new SQLiteParameter("@Author", someBook.Author)); command.Parameters.Add(new SQLiteParameter("@Price", someBook.Price)); command.ExecuteNonQuery(); } catch (Exception exception) { Console.WriteLine(exception.Message); throw; } } }
データベースの指定データを削除する
/// <summary> /// データベースの指定データを削除する /// </summary> public void DelDataBase(Book someBook) { using (var connection = new SQLiteConnection(ConnectionString)) using (var command = connection.CreateCommand()) { try { // データベースの接続開始 connection.Open(); // SQLの設定 command.CommandText = @"DELETE FROM T_BOOKLIST WHERE ID=@ID"; command.Parameters.Add(new SQLiteParameter("@ID", someBook.ID)); // SQLの実行 command.ExecuteNonQuery(); } catch (Exception exception) { Console.WriteLine(exception.Message); throw; } } }
データベースに格納されているデータの最大のIDを検索する
/// <summary> /// データベースに格納する次のデータのID値を返す /// </summary> /// <remarks> /// データベースにデータがない場合は、戻り値として1を返す /// </remarks> /// <returns></returns> public int GetIDNextData() { var resultID = 0; using (var connection = new SQLiteConnection(ConnectionString)) using (var command = connection.CreateCommand()) { try { // データベースの接続開始 connection.Open(); // SQLの設定 command.CommandText = @"SELECT MAX(ID) FROM T_BOOKLIST"; // SQLの実行 using (var reader = command.ExecuteReader()) { while (reader.Read() == true) { resultID = reader.GetInt32(0); } } } catch (Exception exception) { Console.WriteLine(exception.Message); } } return resultID + 1; }
ソースコード
テストアプリのソースコードを以下に置きました。 よろしければ、ダウンロードしてみてください。 github.com
参考リンク
https://www.doraxdora.com/blog/2017/06/09/post-1184/
まとめ
SQLiteを用いると、データの取得・削除・検索が簡単にできるようになります。
ただし、現在のテストアプリでは、データベースをコントロールクラスが、特定の独自クラス専用になっているため、汎用的に使用するようにするには、さらに工夫が必要です。
以下のページがよさそうです。トランザクション処理も非常に勉強になります。
- System.Data.SQLiteの自作ラッパクラス jikkenjo.net
あとがき
この後は、Webから取得した情報を表示することを試してみたいと思います。(Webスクレイピング)