[GitHub 操作] [程式碼覆蓋率報告]
使用以下包之一:
版本 | 包裹 | 描述 |
---|---|---|
sqlite-net-pcl | .NET 標準函式庫 | |
sqlite-net-sqlcipher | 具有加密支持 | |
sqlite 網路靜態 | 使用P/Invokes平台提供的sqlite3的特殊版本 | |
sqlite-網路基礎 | 沒有 SQLitePCLRaw 捆綁包,因此您可以選擇自己的提供者 |
SQLite-net 是一個開源的最小函式庫,允許 .NET、.NET Core 和 Mono 應用程式將資料儲存在 SQLite 3 資料庫中。它最初設計用於與 Xamarin.iOS 配合使用,但後來逐漸發展到可以在所有平台(Xamarin.*、.NET、UWP、Azure 等)上使用。
SQLite-net 被設計為一個快速且方便的資料庫層。其設計遵循以下目標:
非常容易與現有專案整合並在所有 .NET 平台上運行。
SQLite 的瘦包裝器,快速且有效率。 (這個庫不應該成為查詢的效能瓶頸。)
用於安全執行 CRUD 操作和查詢(使用參數)並以強類型方式檢索這些查詢結果的非常簡單的方法。
與您的資料模型一起使用,而無需強制您更改類別。 (包含一個小的反射驅動的 ORM 層。)
從 NuGet 安裝 sqlite-net-pcl。
重要提示:您需要將 NuGet 套件新增至.NET Standard 程式庫專案和平台相關的應用程式專案中。
SQLite-net 全部包含在 1 個檔案中(我知道,很酷吧?)並且很容易添加到您的專案中。只需將 SQLite.cs 新增到您的專案中,您就可以開始建立表格了。可以在 SQLiteAsync.cs 中找到非同步實作。
這是一個開源項目,歡迎使用它的人提供貢獻/建議/錯誤報告。如果您對如何改進該程式庫有任何想法,請在 GitHub 上發布問題。請查看如何貢獻。
請查閱 Wiki 以獲得完整的文件。
此庫包含可用於控製表的構造的簡單屬性。在一個簡單的庫存程序中,您可以使用:
public class Stock
{
[ PrimaryKey , AutoIncrement ]
public int Id { get ; set ; }
public string Symbol { get ; set ; }
}
public class Valuation
{
[ PrimaryKey , AutoIncrement ]
public int Id { get ; set ; }
[ Indexed ]
public int StockId { get ; set ; }
public DateTime Time { get ; set ; }
public decimal Price { get ; set ; }
[ Ignore ]
public string IgnoreField { get ; set ; }
}
一旦您在模型中定義了對象,您就可以選擇 API。您可以使用“同步 API”,其中一次呼叫會阻塞一個,也可以使用“非同步 API”,其中呼叫不會阻塞。您可能希望對行動應用程式使用非同步 API,以提高回應速度。
這兩個 API 將在下面的兩節中進行解釋。
定義實體後,您可以透過呼叫CreateTable
在資料庫中自動產生表格:
// Get an absolute path to the database file
var databasePath = Path . Combine ( Environment . GetFolderPath ( Environment . SpecialFolder . MyDocuments ) , " MyData.db " ) ;
var db = new SQLiteConnection ( databasePath ) ;
db . CreateTable < Stock > ( ) ;
db . CreateTable < Valuation > ( ) ;
您可以使用Insert
在資料庫中插入行。如果表包含自動遞增主鍵,則插入後該鍵的值將可供您使用:
public static void AddStock ( SQLiteConnection db , string symbol ) {
var stock = new Stock ( ) {
Symbol = symbol
} ;
db . Insert ( stock ) ;
Console . WriteLine ( " {0} == {1} " , stock . Symbol , stock . Id ) ;
}
Update
和Delete
也存在類似的方法。
查詢資料最直接的方法是使用Table
方法。這可以透過 WHERE 子句和/或加上 ORDER BY 子句採用謂詞來約束:
var query = db . Table < Stock > ( ) . Where ( v => v . Symbol . StartsWith ( " A " ) ) ;
foreach ( var stock in query )
Console . WriteLine ( " Stock: " + stock . Symbol ) ;
您也可以使用Query
方法在低層級查詢資料庫:
public static IEnumerable < Valuation > QueryValuations ( SQLiteConnection db , Stock stock ) {
return db . Query < Valuation > ( " select * from Valuation where StockId = ? " , stock . Id ) ;
}
Query
方法的通用參數指定為每行建立的物件類型。它可以是表格類別之一,也可以是其公共屬性與查詢傳回的資料列相符的任何其他類別。例如,我們可以將上面的查詢重寫為:
public class Val
{
public decimal Money { get ; set ; }
public DateTime Date { get ; set ; }
}
public static IEnumerable < Val > QueryVals ( SQLiteConnection db , Stock stock ) {
return db . Query < Val > ( " select " Price " as " Money " , " Time " as " Date " from Valuation where StockId = ? " , stock . Id ) ;
}
您可以使用Execute
方法執行資料庫的低階更新。
非同步庫使用任務並行庫(TPL)。因此,正常使用Task
物件以及async
和await
關鍵字將適合您。
定義實體後,您可以透過呼叫CreateTableAsync
自動產生表:
// Get an absolute path to the database file
var databasePath = Path . Combine ( Environment . GetFolderPath ( Environment . SpecialFolder . MyDocuments ) , " MyData.db " ) ;
var db = new SQLiteAsyncConnection ( databasePath ) ;
await db . CreateTableAsync < Stock > ( ) ;
Console . WriteLine ( " Table created! " ) ;
您可以使用Insert
在資料庫中插入行。如果表包含自動遞增主鍵,則插入後該鍵的值將可供您使用:
var stock = new Stock ( )
{
Symbol = " AAPL "
} ;
await db . InsertAsync ( stock ) ;
Console . WriteLine ( " Auto stock id: {0} " , stock . Id ) ;
UpdateAsync
和DeleteAsync
也有類似的方法。
使用Table
方法可以最直接地查詢資料。這將傳回一個AsyncTableQuery
實例,您可以透過 WHERE 子句新增謂詞進行約束和/或新增 ORDER BY。在呼叫特殊檢索方法之一( ToListAsync
、 FirstAsync
或FirstOrDefaultAsync
)之前,不會對資料庫進行實體接觸。
var query = db . Table < Stock > ( ) . Where ( s => s . Symbol . StartsWith ( " A " ) ) ;
var result = await query . ToListAsync ( ) ;
foreach ( var s in result )
Console . WriteLine ( " Stock: " + s . Symbol ) ;
有許多低級方法可用。您也可以透過QueryAsync
方法直接查詢資料庫。除了InsertAsync
等提供的變更操作之外,您還可以發出ExecuteAsync
方法來直接在資料庫中變更資料集。
另一個有用的方法是ExecuteScalarAsync
。這使您可以輕鬆地從資料庫傳回標量值:
var count = await db . ExecuteScalarAsync < int > ( " select count(*) from Stock " ) ;
Console . WriteLine ( string . Format ( " Found '{0}' stock items. " , count ) ) ;
sqlite-net通常使用CreateTable
和Table
方法用作輕型 ORM(物件關係映射器)。但是,您也可以將其用作手動執行查詢的便捷方式。
以下是建立表格、插入表格(使用參數化指令)並在不使用 ORM 功能的情況下查詢表格的範例。
db . Execute ( " create table Stock(Symbol varchar(100) not null) " ) ;
db . Execute ( " insert into Stock(Symbol) values (?) " , " MSFT " ) ;
var stocks = db . Query < Stock > ( " select * from Stock " ) ;
您可以透過 sqlite-net-sqlcipher NuGet 套件來使用加密資料庫。
資料庫鍵在傳遞給連接建構函數的SqliteConnectionString
中設定:
var options = new SQLiteConnectionString ( databasePath , true ,
key : " password " ) ;
var encryptedDb = new SQLiteAsyncConnection ( options ) ;
如果您需要設定編譯指示來控制加密,可以將操作傳遞給連接字串:
var options2 = new SQLiteConnectionString ( databasePath , true ,
key : " password " ,
preKeyAction : db => db . Execute ( " PRAGMA cipher_default_use_hmac = OFF; " ) ,
postKeyAction : db => db . Execute ( " PRAGMA kdf_iter = 128000; " ) ) ;
var encryptedDb2 = new SQLiteAsyncConnection ( options2 ) ;
感謝 .NET 社群對這個計畫的支持,也感謝所有幫助實現這個計畫的貢獻者。
也要感謝 Tirza van Dijk (@tirzavdijk) 提供的優秀標誌!