はじめに
C#プログラマの皆さんは、アプリのデータの永続化はどうしていますか?
- JSONやXMLにしてテキストファイルに保存
- SQLiteに保存
- MySQLやSQLServer等のDBサーバーを構築
などほかにも様々な方法が考えられます。
WinUIや、デスクトップアプリ、MAUIなどのアプリ開発でちょっとしたデータを保存したいけど、JSONだと物足りない、SQLiteはSQL書くのめんどくさい。かといってEFCoreよりも手軽にしたいなんてことはありませんか?
今回はアプリ等のデータをローカルに簡単に保存するのに最適なオープンソースのローカルNoSQLデータベース「LiteDB」を紹介したいと思います。
LiteDBのいいところ
- 100%すべてC#で作られている
- クロスプラットフォーム
- 単一ファイルデータベース
- ライブラリ自体も300KB程度の単一ファイル(LiteDB.DLL)
- DBサーバー不要
- Unityでも使える
- NoSQL
- スレッドセーフ
- 暗号化対応
- そこそこ高速そう (Githubにベンチマークがあります)
一応GUIのクライアントアプリもあるみたいですし、ネットワークに接続しないアプリ等で使用する際にはこれで十分そうですよね。
SQLiteとLiteDBの比較
いくつかの特徴はSQLiteともかぶっていると思いますが、個人的には以下の場合はLiteDBを使います。
- SQLiteはライブラリ自体インストールするだけで約5MBくらいあったので全然Liteじゃなく実行ファイルを小さくしたい
- SQLiteは良くも悪くもC言語のネイティブライブラリのラッパーであるのでクロスプラットフォームで利用することを考えると場合LiteDBのほうが扱いやすい
ただ、パフォーマンスのや信頼性の観点からいうとSQLiteのほうがいいんじゃないかと思います。
SQLiteはMySQLとかSQL Serverと張り合えるくらいには高速ですし実績も多いのですし。
大量のI/Oが起きる場合、数100万レコードの単位のデータを扱う場合、信頼性重視の場合はSQLiteを採用するほうが無難でしょう。
インストール
NuGetの場合
> Install-Package LiteDB
.NET CLIの場合
$ dotnet add package LiteDB
とりあえず公式のサンプルを参考に動かしてみる
とりあえずエンティティを用意
public class Post{
public int Id { get; set; }
public string Title { get; set; }
public string Body { get; set; }
}
使ってみる
// コンストラクタ引数はファイル名
using var context = new LiteDatabase("./data.db");
// エンティティ
var post = new Post() {
Title = "たいとるうううう",
Body = "ぼでえええええええ"
};
// DBへ接続
var posts = context.GetCollection<Post>("posts");
// Titleをユニークインデックスにする
posts.EnsureIndex(x => x.Title, true);
// 作成
posts.Insert(post);
post.Title = "更新したよおおおお";
// 更新
posts.Update(post);
// 検索
// Titleが「更」で始まるもの
var results = posts.Find(x => x.Title.StartsWith("更"));
まとめ
超簡単にデータの永続化ができましたね!!
これならそんなに規模の大きくないアプリ開発では十分に力を発揮できそうです。
リレーションやインデックス等、詳しくは公式を参照してください。
Githubのリポジトリ
公式サイト