前言
上一章節我們搭建好了EasySQLite的前後端框架,今天我們的主要任務是在後端框架中引入SQLite-net ORM並封裝常用方法(SQLiteHelper)。
七天.NET 8操作SQLite入門到實戰詳細教程
EasySQLite專案原始碼地址
SQLite-net介紹
簡單、強大、跨平臺的 SQLite 客戶端和 .NET 的 ORM。
- GitHub開源地址:https://github.com/praeclarum/sqlite-net
SQLite-net提供了以下四個包:
Package | Description | Package Address |
---|---|---|
sqlite-net-pcl | .NET Standard 庫 | https://www.nuget.org/packages/sqlite-net-pcl |
sqlite-net-sqlcipher | 支援加密 | https://www.nuget.org/packages/sqlite-net-sqlcipher |
sqlite-net-static | 使用平臺提供的 sqlite3 的 P/Invokes 的特殊版本 | https://www.nuget.org/packages/sqlite-net-static |
sqlite-net-base | 使用 SQLitePCLRaw 捆綁包,以便您可以選擇自己的提供程式 | https://www.nuget.org/packages/sqlite-net-base |
SQLite-net 設計目標
SQLite-net 被設計為一個快速便捷的資料庫層。其設計遵循以下目標:
- 非常容易與現有專案整合,並在所有 .NET 平臺上執行。
- 對 SQLite 的薄包裝,快速高效。(這個庫不應該成為查詢效能的瓶頸。)
- 提供非常簡單的方法來安全執行 CRUD 操作和查詢(使用引數),以及以強型別方式檢索這些查詢結果。
- 在不強制更改類的情況下與資料模型一起工作。(包含一個小型的反射驅動 ORM 層。)
安裝 sqlite-net-pcl Nuget包
搜尋sqlite-net-pcl
,選擇最新穩定版本進行安裝:
SQLite同步和非同步方法幫助類
SQLiteHelper
/// <summary>
/// SQLite同步方法幫助類
/// 作者:追逐時光者
/// 建立時間:2023年11月30日
/// </summary>
/// <typeparam name="T"></typeparam>
public class SQLiteHelper<T> where T : new()
{
private readonly string _databasePath = Path.Combine(Environment.CurrentDirectory, "ClassManagement.db");
private readonly SQLiteConnection _connection; // SQLite連線物件
/// <summary>
/// 建構函式
/// </summary>
public SQLiteHelper()
{
// 建立SQLite連線物件並開啟連線
_connection = new SQLiteConnection(_databasePath);
_connection.CreateTable<T>(); // 如果表不存在,則建立該表[不會建立重複的表]
}
/// <summary>
/// 資料插入
/// </summary>
/// <param name="item">要插入的資料項</param>
/// <returns></returns>
public int Insert(T item)
{
return _connection.Insert(item);
}
/// <summary>
/// 資料刪除
/// </summary>
/// <param name="id">要刪除的資料的主鍵ID</param>
/// <returns></returns>
public int Delete(int id)
{
return _connection.Delete<T>(id);
}
/// <summary>
/// 資料更新
/// </summary>
/// <param name="item">要更新的資料項</param>
/// <returns></returns>
public int Update(T item)
{
return _connection.Update(item);
}
/// <summary>
/// 根據條件查詢記錄
/// </summary>
/// <param name="predExpr">查詢條件</param>
/// <returns></returns>
public List<T> Query(Expression<Func<T, bool>> predExpr)
{
return _connection.Table<T>().Where(predExpr).ToList();
}
/// <summary>
/// 查詢所有資料
/// </summary>
/// <returns></returns>
public List<T> QueryAll()
{
return _connection.Table<T>().ToList();
}
/// <summary>
/// 根據條件查詢單條記錄
/// </summary>
/// <param name="predExpr">查詢條件</param>
/// <returns></returns>
public T QuerySingle(Expression<Func<T, bool>> predExpr)
{
return _connection.Table<T>().Where(predExpr).FirstOrDefault();
}
}
SQLiteAsyncHelper
/// <summary>
/// SQLite非同步方法幫助類
/// 作者:追逐時光者
/// 建立時間:2023年11月30日
/// </summary>
/// <typeparam name="T"></typeparam>
public class SQLiteAsyncHelper<T> where T : new()
{
private readonly string _databasePath = Path.Combine(Environment.CurrentDirectory, "ClassManagement.db");
private readonly SQLiteAsyncConnection _connectionAsync; // SQLite連線物件
/// <summary>
/// 建構函式
/// </summary>
public SQLiteAsyncHelper()
{
// 建立SQLite連線物件並開啟連線
_connectionAsync = new SQLiteAsyncConnection(_databasePath);
_connectionAsync.CreateTableAsync<T>(); // 如果表不存在,則建立該表[不會建立重複的表]
}
/// <summary>
/// 資料插入
/// </summary>
/// <param name="item">要插入的資料項</param>
/// <returns></returns>
public async Task<int> InsertAsync(T item)
{
return await _connectionAsync.InsertAsync(item);
}
/// <summary>
/// 資料刪除
/// </summary>
/// <param name="id">要刪除的資料的主鍵ID</param>
/// <returns></returns>
public async Task<int> DeleteAsync(int id)
{
return await _connectionAsync.DeleteAsync<T>(id);
}
/// <summary>
/// 資料更新
/// </summary>
/// <param name="item">要更新的資料項</param>
/// <returns></returns>
public async Task<int> UpdateAsync(T item)
{
return await _connectionAsync.UpdateAsync(item);
}
/// <summary>
/// 根據條件查詢記錄
/// </summary>
/// <param name="predExpr">查詢條件</param>
/// <returns></returns>
public async Task<List<T>> QueryAsync(Expression<Func<T, bool>> predExpr)
{
return await _connectionAsync.Table<T>().Where(predExpr).ToListAsync();
}
/// <summary>
/// 查詢所有資料
/// </summary>
/// <returns></returns>
public async Task<List<T>> QueryAllAsync()
{
return await _connectionAsync.Table<T>().ToListAsync();
}
/// <summary>
/// 根據條件查詢單條記錄
/// </summary>
/// <param name="predExpr">查詢條件</param>
/// <returns></returns>
public async Task<T> QuerySingleAsync(Expression<Func<T, bool>> predExpr)
{
return await _connectionAsync.Table<T>().Where(predExpr).FirstOrDefaultAsync();
}
}
DotNetGuide技術社群交流群
- DotNetGuide技術社群是一個面向.NET開發者的開源技術社群,旨在為開發者們提供全面的C#/.NET/.NET Core相關學習資料、技術分享和諮詢、專案推薦、招聘資訊和解決問題的平臺。
- 在這個社群中,開發者們可以分享自己的技術文章、專案經驗、遇到的疑難技術問題以及解決方案,並且還有機會結識志同道合的開發者。
- 我們致力於構建一個積極向上、和諧友善的.NET技術交流平臺,為廣大.NET開發者帶來更多的價值和成長機會。