Ćwiczenie: przechowywanie danych lokalnie za pomocą narzędzia SQLite
W tym ćwiczeniu użyjesz sqlite do przechowywania informacji lokalnie z aplikacją. W przykładowym scenariuszu podjęto decyzję o buforowania danych aplikacji mediów społecznościowych w celu zwiększenia czasu reakcji. To ćwiczenie tworzy lokalną bazę danych SQLite i używa jej do przechowywania informacji o osobach. Plik fizycznej bazy danych jest zapisywany w magazynie lokalnym.
W tym module jest używany zestaw .NET 10.0 SDK. Upewnij się, że masz zainstalowany program .NET 10.0, uruchamiając następujące polecenie w preferowanym terminalu poleceń:
dotnet --list-sdks
Zostanie wyświetlone dane wyjściowe podobne do następującego przykładu:
9.0.100 [C:\Program Files\dotnet\sdk]
10.0.100 [C:\Program Files\dotnet\sdk]
Upewnij się, że na liście znajduje się wersja rozpoczynająca się od 10 . Jeśli nic nie jest wymienione lub nie można odnaleźć polecenia, zainstaluj najnowszy zestaw SDK platformy .NET 10.0.
Otwieranie rozwiązania startowego
Sklonuj lub pobierz repozytorium ćwiczeń.
Uwaga
Najlepiej sklonować zawartość ćwiczenia do krótkiej ścieżki folderu, takiej jak C:\dev, aby uniknąć plików wygenerowanych przez kompilację przekraczającą maksymalną długość ścieżki.
Użyj programu Visual Studio, aby otworzyć rozwiązanie People.sln , które znajduje się w folderze mslearn-dotnetmaui-store-local-data>People lub folder startowy w programie Visual Studio Code.
Uwaga
Nie próbuj jeszcze uruchomić aplikacji, kod jest niekompletny i zgłasza wyjątki do momentu dodania brakujących elementów w dalszej części tego ćwiczenia.
Definiowanie jednostki SQLite
Otwórz plik Person.cs w folderze Models .
intDodaj właściwość o nazwieIddoPersonklasy.stringDodaj właściwość o nazwieName. Klasa powinna wyglądać następująco:namespace People.Models; public class Person { public int Id { get; set; } public string Name { get; set; } }Zapisz plik Person.cs .
Dodawanie biblioteki SQLite
Kliknij prawym przyciskiem myszy na węźle projektu Osoby w Eksploratorze rozwiązań w programie Visual Studio.
W wyświetlonym menu kontekstowym wybierz pozycję Zarządzaj pakietami NuGet.
Wyszukaj i wybierz pozycję sqlite-net-pcl, a następnie wybierz pozycję Zainstaluj.
W przypadku korzystania z programu Visual Studio Code otwórz terminal i te pakiety przy użyciu następujących poleceń:
dotnet add package sqlite-net-pcl
Dodawanie atrybutów SQLite
W pliku Person.cs dodaj dyrektywę
usingdlaSQLiteprzestrzeni nazw do pliku klasyPerson. Ta dyrektywa umożliwia używanie atrybutów SQLite.using SQLite; namespace People.Models; public class Person { ... }Dodaj adnotację do
Personklasy za pomocą atrybutu[Table]i określ nazwę tabeli jakopeople.IdOkreśl właściwość jako klucz podstawowy. Dodaj adnotację do atrybutów[PrimaryKey]i[AutoIncrement].Dodaj adnotacje do
Namewłaściwości . Określ jegoMaxLengthwartość 250. Określ, że każda wartość w kolumnie powinna mieć wartośćUnique.Ukończona klasa powinna wyglądać następująco:
using SQLite; namespace People.Models; [Table("people")] public class Person { [PrimaryKey, AutoIncrement] public int Id { get; set; } [MaxLength(250), Unique] public string Name { get; set; } }Zapisz plik Person.cs .
Łączenie z bazą danych
Otwórz plik PersonRepository.cs .
Sprawdź klasę
PersonRepository. Ta klasa zawiera niekompletny kod szkieletowy zeTODOznacznikami, w których dodajesz funkcjonalność w celu uzyskania dostępu do bazy danych.Dodaj dyrektywę
usingdlaSQLiteprzestrzeni nazw iPeople.Modelsdo pliku dlaPersonRepository.csklasy .Dodaj pole prywatne
SQLiteConnectiono nazwieconndo klasy powyżejInitfunkcji.InitW funkcji sprawdź, czyconnnie jest równenull. Jeśli tak, wróć natychmiast.if (conn != null) return;W ten sposób kod inicjowania bazy danych SQLite jest uruchamiany tylko raz.
Zainicjuj
connpole, aby nawiązać połączenie z bazą danych przy użyciu zmiennej_dbPath.conn.CreateTableUżyj metody , aby utworzyć tabelę do przechowywaniaPersondanych. UkończonaInitfunkcja powinna wyglądać następująco:using SQLite; using People.Models; ... private SQLiteConnection conn; ... private void Init() { if (conn != null) return; conn = new SQLiteConnection(_dbPath); conn.CreateTable<Person>(); }
Wstaw wiersz do bazy danych
W
PersonRepositoryklasie znajdź metodęAddNewPerson.Aby wstawić nowy
Personobiekt, zastąpTODOkomentarz w tej metodzie kodem. Kod najpierw wywołujeInitmetodę , aby sprawdzić, czy baza danych jest zainicjowana, a następnie używaSQLiteConnectionmetody obiektuInsert. Ustaw zmiennąresultna wartośćInsertzwracaną przez metodę, jak pokazano w poniższym kodzie:public void AddNewPerson(string name) { int result = 0; try { // enter this line Init(); // basic validation to ensure a name was entered if (string.IsNullOrEmpty(name)) throw new Exception("Valid name required"); // enter this line result = conn.Insert(new Person { Name = name }); ... } ... }
Pobieranie wierszy z bazy danych
PersonRepositoryW klasie znajdź metodęGetAllPeople.Wywołaj metodę
Init, aby sprawdzić, czy baza danych została zainicjowana.Użyj metody ogólnej
Table\<T>, aby pobrać wszystkie wiersze w tabeli. OkreślPersonjako parametr typu.ToList()Użyj metody rozszerzenia, aby przekształcić wynik wList\<Person>kolekcję i zwrócić tę kolekcję.Dodaj obsługę błędów, opakowując kod w
try-catchbloku. Jeśli wystąpi błąd, ustawStatusMessagewłaściwość na właściwość wyjątkuMessagei zwróć pustą kolekcję. Ukończona metoda powinna wyglądać następująco:public List<Person> GetAllPeople() { try { Init(); return conn.Table<Person>().ToList(); } catch (Exception ex) { StatusMessage = string.Format("Failed to retrieve data. {0}", ex.Message); } return new List<Person>(); }Zapisz plik PersonRepository.cs .
Integrowanie repozytorium z interfejsem użytkownika
Otwórz plik MauiProgram.cs .
CreateMauiAppW funkcji po instrukcjach, które dodająMainPagestronę jako pojedynczą usługę do aplikacji, dodaj kod, aby wykonać następujące zadania:Utwórz zmienną ciągu o nazwie
dbPath. Zainicjuj ten ciąg za pomocą wyrażeniaFileAccessHelper.GetLocalFilePath("people.db3"). Plik bazy danych używany przez aplikację nosi nazwę people.db3, a aplikacja zapisuje ten plik w magazynie lokalnym na urządzeniu.Użyj iniekcji zależności, aby dodać klasę
PersonRepositoryjako pojedynczą usługę do aplikacji. KlasaPersonRepositoryuwidacznia konstruktor, który pobiera ścieżkę do pliku bazy danych jako parametr ciągu.
Ukończony kod funkcji
CreateMauiApppowinien wyglądać następująco:public static MauiApp CreateMauiApp() { var builder = MauiApp.CreateBuilder(); builder .UseMauiApp<App>() .ConfigureFonts(fonts => { fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold"); }); // Add this code string dbPath = FileAccessHelper.GetLocalFilePath("people.db3"); builder.Services.AddSingleton<PersonRepository>(s => ActivatorUtilities.CreateInstance<PersonRepository>(s, dbPath)); return builder.Build(); }Zapisz plik MauiProgram.cs .
Rozwiń węzeł App.xaml w Eksploratorze Rozwiązań, a następnie otwórz plik App.xaml.cs.
publicDodaj właściwość ,statico nazwiePersonRepo. Ta właściwość przechowujePersonRepositoryobiekt wAppklasie .Zainicjuj
PersonRepowłaściwość w konstruktorze, dodającPersonRepositoryparametr do konstruktora i ustawiając właściwość PersonRepo na wartość w tym parametrze. UkończonaAppklasa powinna wyglądać następująco:public partial class App : Application { public static PersonRepository PersonRepo { get; private set; } public App(PersonRepository repo) { InitializeComponent(); PersonRepo = repo; } }
Uwaga
Proces wstrzykiwania zależności automatycznie wypełnia repo parametr do konstruktora.
Testowanie aplikacji
Skompiluj rozwiązanie przy użyciu CTRL+Shift+B.
Po zakończeniu kompilacji rozpocznij debugowanie przy użyciu F5. Po wyświetleniu interfejsu użytkownika wprowadź swoje imię i nazwisko i wybierz pozycję Dodaj osobę.
Wybierz pozycję Pobierz wszystkie osoby i sprawdź, czy twoje imię i nazwisko jest wyświetlane.
Poeksperymentuj, dodając więcej nazw i pobierając listę przechowywanych osób.
Wróć do programu Visual Studio lub Visual Studio Code i zatrzymaj debugowanie przy użyciu Shift+F5.
Uruchom ponownie aplikację i wybierz pozycję Pobierz wszystkie osoby. Sprawdź, czy nazwy przechowywane wcześniej są nadal przechowywane w bazie danych. Po zakończeniu zamknij aplikację.