Místní ukládání dat pomocí SQLite
Funkce SQLite je užitečná, pokud máte relační data. Předpokládejme, že vytváříte aplikaci sociálních médií. Musíte do aplikace ukládat informace o předplatitelích. Tato data obsahují jedinečné ID pro každého uživatele a jejich jméno. Tento typ relace můžete snadno modelovat v databázi SQLite.
V této lekci se naučíte používat SQLite v aplikaci .NET MAUI pomocí SQLite-net.
Co je SQLite?
SQLite je jednoduchá místní databáze pro různé platformy, která je oborovým standardem pro mobilní aplikace. SQLite nevyžaduje server. Databáze je uložená v jednom souboru disku v systému souborů zařízení. Všechny operace čtení a zápisu se spouštějí přímo proti souboru disku SQLite.
Nativní knihovny SQLite jsou ve výchozím nastavení integrované do Androidu a iOS; modul však podporuje pouze rozhraní API C/C++. Tento scénář není ideální pro vývojáře .NET, kteří chtějí nějakým způsobem komunikovat SQLite a .NET.
Co je SQLite-net?
V nativním modulu SQLite existuje několik obálky jazyka C#, které můžou vývojáři .NET používat. Mnoho vývojářů .NET používá oblíbený obálku jazyka C# s názvem SQLite-net.
SQLite-net je objektově-relační mapovač. Pomáhá zjednodušit proces definování schémat databáze tím, že umožňuje používat modely definované ve vašich projektech, které slouží jako schéma.
Jako příklad zvažte následující třídu, která modeluje User
:
class User
{
public int Id { get; set; }
public string Username { get; set; }
...
}
Pomocí objektově-relačního mapovače můžete vzít tuto počáteční User
třídu a vytvořit tabulku databáze s názvem User
sloupce pro Id
pole a Username
pole v této třídě.
SQLite-net se dodává jako balíček NuGet. Abyste ho mohli používat, musíte do svých aplikací přidat balíček sqlite-net-pcl .
Jak se připojit k databázi SQLite
Z aplikace můžete vytvořit připojení k databázi SQLite prostřednictvím objektu SQLiteConnection
. Tato třída je definována SQLite
v oboru názvů spolu s ostatními typy a metodami SQLite poskytuje. Když vytvoříte instanci tohoto objektu, předáte název souboru databáze. Konstruktor pak buď otevře soubor, pokud existuje, nebo ho vytvoří, pokud neexistuje.
Podívejte se na ukázku kódu:
using SQLite;
...
string filename = ...
SQLiteConnection conn = new SQLiteConnection(filename);
Mějte na paměti, že filename
by měl odkazovat na umístění v sandboxu aplikace.
Vytvoření tabulky
Vzpomeňte si, že SQLite-net je objektově-relační mapovač, což znamená, že můžete vytvořit schéma databáze z tříd jazyka C#. SQLite-net může vytvořit tabulku databáze z běžné třídy jazyka C#, ale existuje mnoho atributů, které můžete přidat do třídy a poskytnout tak další metadata. Tato metadata pomáhají SQLite vynucovat funkce, jako je jedinečnost, a aplikovat omezení na vaše data.
Mezi dostupné atributy patří:
Table
: Pokud chcete, aby byla jiná než název třídy, zadejte název tabulky.PrimaryKey
: Zadejte, že sloupec je primárním klíčem.AutoIncrement
: Určete, že se sloupec při vložení nového řádku automaticky zvýší.Column
: Zadejte název sloupce, pokud chcete, aby byl jiný než název vlastnosti.MaxLength
: Zadejte maximální počet znaků, které lze použít ve sloupci.Unique
: Určete, že hodnota ve sloupci musí být jedinečná ze všech ostatních řádků.
Následující kód ukazuje aktualizovanou verzi User
třídy, která používá tyto atributy:
[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; }
...
}
Po definování třídy jazyka C# zavolejte CreateTable
obecnou metodu SQLiteConnection
třídy, která vygeneruje tabulku v databázi. Zadejte třídu jako parametr typu. Tady je příklad:
SQLiteConnection conn = new SQLiteConnection(filename);
conn.CreateTable<User>();
Pokud tabulka již v databázi existuje, CreateTable
metoda zkontroluje schéma a zjistí, jestli nedošlo k nějakým změnám. Pokud existuje, operace se pokusí aktualizovat schéma databáze.
Jak provádět základní operace čtení a zápisu
Po vytvoření tabulky s ní můžete začít pracovat. Chcete-li přidat řádek, použijte Insert
metodu SQLiteConnection
v instanci a zadejte objekt příslušného typu, který obsahuje data, která se mají vložit. Následující kód ukazuje, jak do tabulky přidat nový řádek User
:
public int AddNewUser(User user)
{
int result = conn.Insert(user);
return result;
}
Metoda Insert
vrátí hodnotu int
, která představuje počet řádků vložených do tabulky. V tomto případě je toto číslo jedno.
Pokud chcete načíst řádky z tabulky, použijte metodu Table
. Tato metoda vrátí kolekci objektů (což může být prázdné):
public List<User> GetAllUsers()
{
List<User> users = conn.Table<User>().ToList();
return users;
}
Metoda Table
vrátí objekt TableQuery\<T>
. Chcete-li získat List
, použijte metodu ToList
, jak je znázorněno v předchozím příkladu.
Spuštění dotazu SQLite pomocí LINQ
Metoda Table
načte všechny řádky z tabulky. Ve většině případů chcete vrátit pouze podmnožinu řádků, které odpovídají sadě zadaných kritérií. Pro tyto úlohy použijte LINQ s SQLite-net.
SQLite-net podporuje řadu běžných dotazů LINQ, mezi které patří:
Where
Take
Skip
OrderBy
OrderByDescending
ThenBy
ElementAt
First
FirstOrDefault
ThenByDescending
Count
Pomocí těchto metod můžete použít syntaxi metody rozšíření nebo syntaxi LINQ C#. Tady je například fragment kódu, který umožňuje načíst podrobnosti o zadaném uživateli:
public User GetByUsername(string username)
{
var user = from u in conn.Table<User>()
where u.Username == username
select u;
return user.FirstOrDefault();
}
Aktualizace a odstranění řádků
Řádek aktualizujete pomocí metody objektu SQLiteConnection
Update
. Zadáte objekt definující řádek, který se má aktualizovat novými hodnotami. Metoda Update
upraví řádek, který má stejnou hodnotu primárního klíče jako zadaný objekt. Vrácená hodnota je počet změněných řádků. Pokud je tato hodnota nula, nebyly nalezeny žádné řádky s odpovídajícím primárním klíčem a nic se neaktualizovalo. Následující fragment kódu ukazuje tuto metodu v akci:
public int UpdateUser(User user)
{
int result = 0;
result = conn.Update(user);
return result;
}
Odeberte řádky z tabulky pomocí metody objektu SQLiteConnection
Delete
. Nejjednodušší forma této metody přebírá primární klíč položky, který se má odstranit jako parametr, jak je znázorněno v následujícím příkladu. Tato forma Delete
metody je obecná a vyžaduje parametr typu. Vrácená hodnota je počet řádků odebraných z tabulky:
public int DeleteUser(int userID)
{
int result = 0;
result = conn.Delete<User>(userID);
return result;
}