Lokalne przechowywanie danych za pomocą narzędzia SQLite
SqLite jest przydatne, gdy masz dane relacyjne. Załóżmy, że tworzysz aplikację mediów społecznościowych. Musisz przechowywać informacje o subskrybentach aplikacji. Te dane zawierają unikatowy identyfikator dla każdego użytkownika i jego nazwę. Ten rodzaj relacji można łatwo modelować w bazie danych SQLite.
W tej lekcji dowiesz się, jak używać biblioteki SQLite w aplikacji .NET MAUI przy użyciu sqlite-net.
Co to jest SQLite?
SQLite to uproszczona lokalna baza danych międzyplatformowa, która jest standardem branżowym dla aplikacji mobilnych. SqLite nie wymaga serwera. Baza danych jest przechowywana w jednym pliku dysku w systemie plików urządzenia. Wszystkie operacje odczytu i zapisu są uruchamiane bezpośrednio względem pliku dysku SQLite.
Biblioteki natywne SQLite są domyślnie wbudowane w systemy Android i iOS; aparat obsługuje jednak tylko interfejs API języka C/C++. Ten scenariusz nie jest idealny dla deweloperów platformy .NET, którzy chcą korzystać ze środowiska SQLite i platformy .NET.
Co to jest SQLite-net?
Istnieje kilka otoek języka C# wokół natywnego aparatu SQLite, którego mogą używać deweloperzy platformy .NET. Wielu deweloperów platformy .NET używa popularnej otoki języka C# o nazwie SQLite-net.
SQLite-net to maper obiektowo-relacyjny. Pomaga to uprościć proces definiowania schematów bazy danych, umożliwiając korzystanie z modeli zdefiniowanych w projektach, które służą jako schemat.
Rozważmy na przykład następującą klasę, która modeluje klasę User
:
class User
{
public int Id { get; set; }
public string Username { get; set; }
...
}
Używając mapatora relacyjnego obiektu, możesz użyć tej początkowej User
klasy i utworzyć tabelę bazy danych o nazwie User
zawierającą kolumny dla Id
pól i Username
w tej klasie.
SqLite-net jest dostarczany jako pakiet NuGet. Aby używać go, musisz dodać pakiet sqlite-net-pcl do aplikacji.
Jak nawiązać połączenie z bazą danych SQLite
Połączenie z bazą danych SQLite można nawiązać z aplikacji za pośrednictwem SQLiteConnection
obiektu. Ta klasa jest definiowana SQLite
w przestrzeni nazw wraz z innymi typami i metodami SQLite. Po utworzeniu wystąpienia tego obiektu należy przekazać nazwę pliku bazy danych. Konstruktor następnie otwiera plik, jeśli istnieje lub tworzy go, jeśli nie jest obecny.
Poniżej znajduje się kod przykładowy:
using SQLite;
...
string filename = ...
SQLiteConnection conn = new SQLiteConnection(filename);
Pamiętaj, że filename
należy wskazać lokalizację w piaskownicy aplikacji.
Jak utworzyć tabelę
Pamiętaj, że SQLite-net jest maperem obiekt-relacyjnym, co oznacza, że można utworzyć schemat bazy danych z klas języka C#. SqLite-net może utworzyć tabelę bazy danych ze zwykłej klasy C#, ale istnieje wiele atrybutów, które można dodać do klasy, aby zapewnić więcej metadanych. Te metadane pomagają sqLite wymuszać funkcje, takie jak unikatowość i stosować ograniczenia do danych.
Dostępne atrybuty to:
-
Table
: określ nazwę tabeli, jeśli chcesz, aby była inna niż nazwa klasy. -
PrimaryKey
: Określ, że kolumna jest kluczem podstawowym. -
AutoIncrement
: Określ, że kolumna powinna automatycznie zwiększać wartość po wstawieniu nowego wiersza. -
Column
: określ nazwę kolumny, jeśli chcesz, aby była inna niż nazwa właściwości. -
MaxLength
: określ maksymalną liczbę znaków, których można użyć w kolumnie. -
Unique
: Określ, że wartość w kolumnie musi być unikatowa ze wszystkich innych wierszy.
Poniższy kod przedstawia zaktualizowaną wersję User
klasy, która stosuje następujące atrybuty:
[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 zdefiniowaniu klasy języka C# wywołaj CreateTable
metodę ogólną w SQLiteConnection
klasie, aby wygenerować tabelę w bazie danych. Określ klasę jako parametr typu. Oto przykład:
SQLiteConnection conn = new SQLiteConnection(filename);
conn.CreateTable<User>();
Jeśli tabela już istnieje w bazie danych, metoda sprawdza schemat, aby sprawdzić, CreateTable
czy istnieją jakieś zmiany. Jeśli tak jest, operacja próbuje zaktualizować schemat bazy danych.
Jak wykonywać podstawowe operacje odczytu i zapisu
Po utworzeniu tabeli możesz rozpocząć interakcję z nią. Aby dodać wiersz, użyj Insert
metody w wystąpieniu SQLiteConnection
i podaj obiekt odpowiedniego typu, który przechowuje dane do wstawienia. Poniższy kod pokazuje, jak dodać nowy wiersz do User
tabeli:
public int AddNewUser(User user)
{
int result = conn.Insert(user);
return result;
}
Metoda Insert
zwraca int
wartość , która reprezentuje liczbę wierszy wstawionych do tabeli. W tym przypadku ta liczba jest jedną.
Aby pobrać wiersze z tabeli, użyj Table
metody . Ta metoda zwraca kolekcję obiektów (które mogą być puste):
public List<User> GetAllUsers()
{
List<User> users = conn.Table<User>().ToList();
return users;
}
Metoda Table
zwraca obiekt TableQuery\<T>
. Aby uzyskać metodę List
, użyj ToList
metody, jak pokazano w poprzednim przykładzie.
Wykonywanie zapytania SQLite przy użyciu LINQ
Metoda Table
pobiera wszystkie wiersze z tabeli. W większości przypadków chcesz zwrócić tylko podzbiór wierszy pasujących do zestawu określonych kryteriów. W przypadku tych zadań należy użyć LINQ z sqlite-net.
SqLite-net obsługuje wiele typowych zapytań LINQ, w tym:
Where
Take
Skip
OrderBy
OrderByDescending
ThenBy
ElementAt
First
FirstOrDefault
ThenByDescending
Count
Za pomocą tych metod można użyć składni metody rozszerzenia lub składni LINQ C#. Oto fragment kodu, który umożliwia pobranie szczegółów określonego użytkownika:
public User GetByUsername(string username)
{
var user = from u in conn.Table<User>()
where u.Username == username
select u;
return user.FirstOrDefault();
}
Aktualizowanie i usuwanie wierszy
Wiersz jest aktualizowany przy użyciu SQLiteConnection
metody obiektu Update
. Należy podać obiekt definiujący wiersz do zaktualizowania przy użyciu nowych wartości. Metoda Update
modyfikuje wiersz, który ma tę samą wartość klucza podstawowego co podany obiekt. Zwracana wartość to liczba zmienionych wierszy. Jeśli ta wartość jest równa zero, nie znaleziono wierszy z pasującym kluczem podstawowym i nic nie zostało zaktualizowane. Następny fragment kodu przedstawia tę metodę w akcji:
public int UpdateUser(User user)
{
int result = 0;
result = conn.Update(user);
return result;
}
Usuń wiersze z tabeli przy SQLiteConnection
użyciu metody obiektu Delete
. Najprostszą formą tej metody jest usunięcie klucza podstawowego elementu jako parametru, jak pokazano w poniższym przykładzie. Ta forma Delete
metody jest ogólna i wymaga parametru typu. Zwracana wartość to liczba wierszy usuniętych z tabeli:
public int DeleteUser(int userID)
{
int result = 0;
result = conn.Delete<User>(userID);
return result;
}