SQLite 資料庫引擎可讓 .NET 多平臺應用程式 UI (.NET MAUI) 應用程式在共用程式碼中載入和儲存資料物件。 您可以遵循下列步驟,將 SQLite.NET 整合到 .NET MAUI 應用程式中,以在本機資料庫中儲存和擷取資訊:
安裝 NuGet 套件
。
設定常數
。
建立 TodoItem 類別
。
建立數據庫存取類別
。
存取數據
。
進階設定。
本文使用
sqlite-net-pcl
NuGet 套件,透過提供 SQLite 資料庫存取權來儲存待辦事項項目的數據表。 替代方法是使用
Microsoft.Data.Sqlite
NuGet 套件,這是 SQLite 的輕量
型 ADO.NET
提供者。 Microsoft.Data.Sqlite 會針對連線、命令和數據讀取器等功能實作常見的 ADO.NET 抽象概念。
安裝 SQLite NuGet 套件
使用 NuGet 套件管理員來搜尋
sqlite-net-pcl
套件,並將最新版本新增至 .NET MAUI 應用程式專案。
有許多名稱類似的 NuGet 套件。 正確的套件有下列屬性:
識別碼:
sqlite-net-pcl
作者:
SQLite-net
擁有者:
「praeclarum」
NuGet 連結:
sqlite-net-pcl
儘管套件名稱如此,應在 .NET MAUI 專案中使用
sqlite-net-pcl
NuGet 套件。
SQLite.NET 是由
praeclarum/sqlite-net 儲存庫
所支援的第三方程式庫。
設定數據,例如資料庫檔名和路徑,可以儲存為應用程式中的常數。 範例專案包含提供
一般組態數據的Constants.cs
檔案:
public static class Constants
public const string DatabaseFilename = "TodoSQLite.db3";
public const SQLite.SQLiteOpenFlags Flags =
// open the database in read/write mode
SQLite.SQLiteOpenFlags.ReadWrite |
// create the database if it doesn't exist
SQLite.SQLiteOpenFlags.Create |
// enable multi-threaded database access
SQLite.SQLiteOpenFlags.SharedCache;
public static string DatabasePath =>
Path.Combine(FileSystem.AppDataDirectory, DatabaseFilename);
在此範例中,常數檔案會指定用來初始化資料庫連接的預設 SQLiteOpenFlag 列舉值。 列舉型別 SQLiteOpenFlag 支援以下值:
Create:如果連接不存在,聯機會自動建立資料庫檔案。
FullMutex:連線是以串行化線程模式開啟。
NoMutex:連線是以多線程模式開啟。
PrivateCache:即使連線已啟用,連線也不會參與共用快取。
ReadWrite:連接可以讀取和寫入數據。
SharedCache:如果已啟用共用快取,連線將會參與共用快取。
ProtectionComplete:在鎖定裝置時,檔案會加密且無法存取。
ProtectionCompleteUnlessOpen:檔案會在開啟之前加密,但即使使用者鎖定裝置,仍可存取該檔案。
ProtectionCompleteUntilFirstUserAuthentication:檔案會在用戶開機並解除鎖定裝置之前加密。
ProtectionNone:資料庫檔案未加密。
您可能需要根據資料庫的使用方式來指定不同的旗標。 如需 的詳細資訊 SQLiteOpenFlags,請參閱 在 sqlite.org 上開啟新的資料庫連接 。
建立 TodoItem 類別
在撰寫資料庫存取程式代碼之前,請先建立將儲存數據的類別。
public class TodoItem
[PrimaryKey, AutoIncrement]
public int ID { get; set; }
public string Name { get; set; }
public string Notes { get; set; }
public bool Done { get; set; }
此類別中的識別碼將做為儲存時自動遞增的主鍵。 屬性可用來指定此行為。
建立數據庫存取類別
資料庫包裝函式類別會從應用程式的其餘部分擷取數據存取層。 這個類別會集中查詢邏輯,並簡化資料庫初始化的管理,讓您在應用程式成長時更輕鬆地重構或擴充數據作業。 範例應用程式會為此目的定義類別 TodoItemDatabase 。
延遲初始化
使用 TodoItemDatabase 進行異步的惰性初始化,將資料庫初始化延後到第一次存取時才進行,這是透過類別中每個方法所呼叫的一個簡單 Init 方法來實現的:
public class TodoItemDatabase
SQLiteAsyncConnection database;
async Task Init()
if (database is not null)
return;
database = new SQLiteAsyncConnection(Constants.DatabasePath, Constants.Flags);
var result = await database.CreateTableAsync<TodoItem>();
數據操作方法
類別 TodoItemDatabase 包含四種數據操作類型的方法:建立、讀取、編輯和刪除。 SQLite.NET 連結庫提供簡單的物件關係型對應 (ORM),可讓您儲存和擷取物件,而不需要撰寫 SQL 語句。
下列範例顯示範例應用程式中的數據操作方法:
public class TodoItemDatabase
public async Task<List<TodoItem>> GetItemsAsync()
await Init();
return await database.Table<TodoItem>().ToListAsync();
public async Task<List<TodoItem>> GetItemsNotDoneAsync()
await Init();
return await database.Table<TodoItem>().Where(t => t.Done).ToListAsync();
// SQL queries are also possible
//return await Database.QueryAsync<TodoItem>("SELECT * FROM [TodoItem] WHERE [Done] = 0");
public async Task<TodoItem> GetItemAsync(int id)
await Init();
return await database.Table<TodoItem>().Where(i => i.ID == id).FirstOrDefaultAsync();
public async Task<int> SaveItemAsync(TodoItem item)
await Init();
if (item.ID != 0)
return await database.UpdateAsync(item);
return await database.InsertAsync(item);
public async Task<int> DeleteItemAsync(TodoItem item)
await Init();
return await database.DeleteAsync(item);
如果您使用相依性插入,則可以將 TodoItemDatabase 類別註冊為單例,以在整個應用程式中使用。 例如,您可以將您的頁面和數據庫訪問類別作為服務註冊到IServiceCollection對象中,使用和AddSingleton方法,位於AddTransient內。
builder.Services.AddSingleton<TodoListPage>();
builder.Services.AddTransient<TodoItemPage>();
builder.Services.AddSingleton<TodoItemDatabase>();
然後,這些服務可以自動插入類別建構函式,並加以存取:
TodoItemDatabase database;
public TodoItemPage(TodoItemDatabase todoItemDatabase)
InitializeComponent();
database = todoItemDatabase;
async void OnSaveClicked(object sender, EventArgs e)
if (string.IsNullOrWhiteSpace(Item.Name))
await DisplayAlert("Name Required", "Please enter a name for the todo item.", "OK");
return;
await database.SaveItemAsync(Item);
await Shell.Current.GoToAsync("..");
TodoItemDatabase database;
public TodoItemPage(TodoItemDatabase todoItemDatabase)
InitializeComponent();
database = todoItemDatabase;
async void OnSaveClicked(object sender, EventArgs e)
if (string.IsNullOrWhiteSpace(Item.Name))
await DisplayAlertAsync("Name Required", "Please enter a name for the todo item.", "OK");
return;
await database.SaveItemAsync(Item);
await Shell.Current.GoToAsync("..");
或者,也可以建立數據庫存取類別的新實例:
TodoItemDatabase database;
public TodoItemPage()
InitializeComponent();
database = new TodoItemDatabase();
如需 .NET MAUI 應用程式中相依性插入的詳細資訊,請參閱 相依性插入。
SQLite 提供強固的 API,其功能比本文和範例應用程式所涵蓋的功能還多。 下列各節涵蓋對於延展性而言很重要的功能。
如需詳細資訊,請參閱 sqlite.org 的 SQLite 檔 。
預寫式日志
根據預設,SQLite 會使用傳統的回復日誌。 未變更的資料庫內容複本會寫入個別的回復檔案,然後變更會直接寫入資料庫檔案。 刪除回滾日誌時,就會發生 COMMIT。
預先寫入記錄 (WAL) 會先將變更寫入個別的 WAL 檔案。 在 WAL 模式中,COMMIT 是附加至 WAL 檔案的特殊記錄,可讓單一 WAL 檔案中發生多個交易。 WAL 檔案會在稱為 檢查點的特殊作業中,合併回資料庫檔案。
WAL 對於本機資料庫來說可能更快,因為讀取器和寫入器不會彼此封鎖,因此允許讀取和寫入作業同時運作。 不過,WAL 模式不允許變更 頁面大小、將其他檔案關聯新增至資料庫,以及新增額外的 檢查點 作業。
若要在 SQLite.NET 中啟用 WAL,請在 實體上EnableWriteAheadLoggingAsync呼叫 SQLiteAsyncConnection 方法:
await Database.EnableWriteAheadLoggingAsync();
如需詳細資訊,請參閱 SQLite 預先寫入記錄 sqlite.org。
複製資料庫
在某些情況下,可能需要複製 SQLite 資料庫:
資料庫隨附於您的應用程式,但必須複製或移至行動裝置上的可寫入記憶體。
您必須建立資料庫的備份或複本。
您需要版本、移動或重新命名資料庫檔案。
一般而言,移動、重新命名或複製資料庫檔案的過程與任何其他類型的檔案相同,但有一些額外的考量:
嘗試移動資料庫檔案之前,應該先關閉所有資料庫連接。
如果您使用 預寫日誌,SQLite 會建立共用記憶體存取(.shm)檔案和預寫日誌(.wal)檔案。 請確定您也對這些檔案套用任何變更。