Start Debugging

WinUI 3 の "ローカル専用ノート" アプリは正しい意味で退屈: オフラインファースト、SQLite、キーボード優先

Miyanyedi Quick Note は WinUI 3 + SQLite のメモアプリで、オフラインファーストかつプライバシー重視です。「ローカル専用」が機能である理由と、.NET 8 のデスクトップアプリ向け最小 SQLite スニペットを紹介します。

今日 r/csharp に、また「小さいが本物の」デスクトップアプリが登場しました: Miyanyedi Quick NoteWinUI 3SQLite で作られた軽量なメモツールで、オフラインファーストとプライバシー重視を明確に意図して設計されています。

ソース: 元の投稿と Microsoft Store のリスティング: r/csharp スレッドMicrosoft Store のアプリページ

「ローカル専用」は機能であり、欠けたチェックボックスではない

ほとんどのメモアプリは、同期が成長レバーであるためアカウントシステムへ流れていきます。トレードオフは明白です: 攻撃面の増加、ダウンタイムの増加、「データはどこへ消えた」案件の増加。

Windows デスクトップユーティリティにとって、「クラウドなし」が製品そのものになり得ます:

.NET 8 (または .NET 9) で社内ツーリングを構築しているなら、この「オフラインファーストをデフォルトに」という考え方はよいベースラインです。

SQLite が WinUI 3 アプリと相性が良いのは、ドメインを小さく保つから

SQLite は「データベースの選択」ではなく、スコープの選択です。あなたはこう言っています:

これは WinUI 3 の UI 要件とよく合います: CRUD を UI スレッドの外に出し、リストを素早く更新し、サーバーには一切触れずに済みます。

Microsoft.Data.Sqlite を使った「メモを挿入し、最新を一覧する」最小スニペットは次のとおりで、任意の .NET 8 デスクトップアプリで動きます:

using Microsoft.Data.Sqlite;

static async Task AddNoteAsync(string dbPath, string text, CancellationToken ct)
{
    await using var conn = new SqliteConnection($"Data Source={dbPath}");
    await conn.OpenAsync(ct);

    var cmd = conn.CreateCommand();
    cmd.CommandText = """
        INSERT INTO notes(text, created_utc)
        VALUES ($text, $createdUtc);
        """;
    cmd.Parameters.AddWithValue("$text", text);
    cmd.Parameters.AddWithValue("$createdUtc", DateTimeOffset.UtcNow.ToString("O"));
    await cmd.ExecuteNonQueryAsync(ct);
}

static async Task<List<string>> ListLatestAsync(string dbPath, int take, CancellationToken ct)
{
    await using var conn = new SqliteConnection($"Data Source={dbPath}");
    await conn.OpenAsync(ct);

    var cmd = conn.CreateCommand();
    cmd.CommandText = """
        SELECT text
        FROM notes
        ORDER BY created_utc DESC
        LIMIT $take;
        """;
    cmd.Parameters.AddWithValue("$take", take);

    var results = new List<string>();
    await using var reader = await cmd.ExecuteReaderAsync(ct);
    while (await reader.ReadAsync(ct))
        results.Add(reader.GetString(0));

    return results;
}

残りは UI です: リストをバインドし、Enter で保存、Esc でフォーカスを処理し、操作感をきびきび保ちます。

自分の Windows App SDK の UI 設計の妥当性を確かめる例が欲しいなら、こうしたアプリは巨大なサンプルリポジトリより役に立ちます。コピーできる程度には小さく、難所をあらわにする程度には現実的です。

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< 戻る