使用 SQLite 在本機儲存資料
當您有關聯式資料時,SQLite 將有其效用。 假設您要建置社交媒體應用程式。 您需要將訂閱者的相關資訊儲存至應用程式。 這項資料包括每個使用者的唯一識別碼及其名稱。 您可以在 SQLite 資料庫中輕鬆地建立這種關聯性的模型。
在此單元中,您會了解如何利用 SQLite-net 在 .NET MAUI 應用程式中使用 SQLite。
什麼是 SQLite?
SQLite 是輕量型的跨平台本機資料庫,它是行動應用程式的產業標準。 SQLite 不需要伺服器。 資料庫會儲存在裝置檔案系統的單一磁碟檔案中。 所有讀取和寫入作業會直接在 SQLite 磁碟檔案執行。
根據預設,SQLite 原生程式庫內建於 Android 和 iOS;不過,引擎僅支援 C/C++ API。 這對於 .NET 開發人員來說不是最理想的狀況,他們需要某種方式讓 .NET 與 SQLite 互動。
什麼是 SQLite-net?
原生 SQLite 引擎有幾個 C# 包裝函式可讓 .NET 開發人員使用。 許多 .NET 開發人員均使用名為 SQLite-net 的熱門 C# 包裝函式。
SQLite-net 是物件關聯式對應程式。 它透過讓您使用在專案中定義的模型作為結構描述,從而簡化定義資料庫結構的程序。
例如,請考慮建立 User 模型的下列類別:
class User
{
public int Id { get; set; }
public string Username { get; set; }
...
}
藉由使用物件關聯式對應工具,您可以採用這個初始 User 類別,並建立名為 User 的資料庫資料表,其具有此類別中 Id 和 Username 欄位的資料行。
SQLite-net 隨附為 NuGet 套件。 您必須將 sqlite-net-pcl 套件新增至應用程式,才能加以使用。
如何連線至 SQLite 資料庫
您可以透過 SQLiteConnection 物件建立從應用程式到 SQLite 資料庫的連線。 這個類別,以及 SQLite 提供的其他類型和方法定義在 SQLite 命名空間中。 在具現化此物件時,必須傳入資料庫檔案的檔案名稱。 然後建構函式會開啟檔案 (如果存在) 或建立該檔案 (如果不存在)。
下列程式碼顯示一個範例:
using SQLite;
...
string filename = ...
SQLiteConnection conn = new SQLiteConnection(filename);
請記住,filename 應指向應用程式沙箱中的位置。
如何建立資料表
您應該記得,SQLite-net 是物件關聯式對應程式,這表示您可以從 C# 類別建置您的資料庫結構描述。 SQLite-net 可從一般 C# 類別建置資料庫資料表,但您可以在類別中新增許多屬性以提供更多中繼資料。 此中繼資料可協助 SQLite 強制執行唯一性等功能,以及將條件約束套用至您的資料。
可用的屬性包括:
-
Table:指定資料表的名稱 (如果您想要類別名稱以外的名稱)。 -
PrimaryKey:指定資料行是主索引鍵。 -
AutoIncrement:指定資料行應於插入新資料列時自動增加值。 -
Column:指定資料行的名稱 (如果您想要屬性名稱以外的名稱)。 -
MaxLength:指定資料行中的最大可用字元數。 -
Unique:指定資料行中之值必須是其他所有資料列中的唯一。
下列程式碼顯示套用這些屬性的 User 類別的更新版本:
[Table("user")]
public class User
{
// PrimaryKey is typically numeric
[PrimaryKey, AutoIncrement, Column("_id")]
public int Id { get; set; }
[MaxLength(250), Unique]
public string Username { get; set; }
...
}
定義 C# 類別之後,請呼叫 CreateTable 類別上的 SQLiteConnection 泛型方法,以在資料庫中產生資料表。 將類別指定為類型參數。 以下是範例:
SQLiteConnection conn = new SQLiteConnection(filename);
conn.CreateTable<User>();
如果資料表已存在於資料庫中,CreateTable 方法會檢查結構描述,以查看是否有任何變更。 如果有的話,作業會嘗試更新資料庫結構描述。
如何執行基本的讀取和寫入作業
建立資料表之後,您可以開始與其互動。 若要新增資料列,請在 Insert 執行個體上使用 SQLiteConnection 方法,並提供保留要插入之資料的適當型別物件。 下列程式碼顯示如何將新的資料列新增至 User 資料表:
public int AddNewUser(User user)
{
int result = conn.Insert(user);
return result;
}
Insert 方法會傳回 int,這表示已插入至資料表的資料列數目。 在此案例中只有一個。
若要從資料表擷取資料列,請使用 Table 方法。 這個方法會傳回物件集合 (可能是空的):
public List<User> GetAllUsers()
{
List<User> users = conn.Table<User>().ToList();
return users;
}
Table 方法會傳回 TableQuery\<T> 物件。 若要取得 List,請使用 ToList 方法,如上述範例所示。
使用 LINQ 執行 SQLite 查詢
Table 方法會從資料表中擷取所有資料列。 在多數情況下,您只需要傳回與一組指定準則相符的資料列子集。 若要執行這些工作,請搭配使用 LINQ 與 SQLite-net。
SQLite-net 支援許多常見的 LINQ 查詢,包括:
WhereTakeSkipOrderByOrderByDescendingThenByElementAtFirstFirstOrDefaultThenByDescendingCount
藉由這些方法,您可以使用擴充方法語法或 LINQ C# 語法。 例如,以下是程式碼片段,可讓您擷取指定使用者的詳細資料:
public User GetByUsername(string username)
{
var user = from u in conn.Table<User>()
where u.Username == username
select u;
return user.FirstOrDefault();
}
更新及刪除資料列
您可以使用 SQLiteConnection 物件的 Update 方法更新資料列。 您可以提供一個物件,用以定義要以新值更新的資料列。
Update 方法會修改與所提供物件具有相同主索引鍵值的資料列。 傳回的值是從變更的資料列數目。 如果此值為零,則找不到具有相符主索引鍵的資料列,且不會更新任何資料列。 下一個程式碼片段顯示此方法的運作情形:
public int UpdateUser(User user)
{
int result = 0;
result = conn.Update(user);
return result;
}
使用 SQLiteConnection 物件的 Delete 方法,從資料表中移除資料列。 此方法最簡單的形式,是採用要刪除之項目的主索引鍵做為參數,如下列範例所示。 這個 Delete 方法的形式是泛型的,而且需要型別參數。 傳回的值是從資料表中移除的資料列數目:
public int DeleteUser(int userID)
{
int result = 0;
result = conn.Delete<User>(userID);
return result;
}