Übung: Lokales Speichern von Daten mit SQLite
In dieser Übung verwenden Sie SQLite zum lokalen Speichern von Informationen mit einer Anwendung. Im Beispielszenario haben Sie beschlossen, Daten für die Social Media-App zwischenzuspeichern, um die Reaktionsfähigkeit zu verbessern. In dieser Übung erstellen und verwenden Sie eine lokale SQLite-Datenbank zum Speichern von Informationen über Personen. Sie speichern die physische Datenbankdatei im lokalen Speicher.
In diesem Modul wird das .NET 9.0 SDK verwendet. Stellen Sie sicher, dass .NET 9.0 installiert ist, indem Sie in Ihrem bevorzugten Befehlsterminal den folgenden Befehl ausführen:
dotnet --list-sdks
Die daraufhin angezeigte Ausgabe sieht in etwa wie im folgenden Beispiel aus:
8.0.100 [C:\Program Files\dotnet\sdk]
9.0.100 [C:\Program Files\dotnet\sdk]
Stellen Sie sicher, dass eine Version aufgeführt wird, die mit 9
beginnt. Wenn nichts aufgeführt ist oder der Befehl nicht gefunden wurde, installieren Sie das neueste .NET 9.0 SDK.
Öffnen der Startprojektmappe
Klonen Sie das Übungsrepository, oder laden Sie es herunter.
Hinweis
Es empfiehlt sich, den Übungsinhalt in einen kurzen Ordnerpfad wie z. B. C:\dev zu klonen. So vermeiden Sie, dass vom Build generierte Dateien die maximale Pfadlänge überschreiten.
Verwenden Sie Visual Studio, um die Lösung People.sln zu öffnen, die Sie in mslearn-dotnetmaui-store-local-data>People oder im Ordner „starter“ in Visual Studio Code finden.
Hinweis
Versuchen Sie noch nicht, die Anwendung auszuführen. Der Code ist unvollständig und wird Ausnahmen auslösen, bis Sie die fehlenden Elemente später in dieser Übung hinzufügen.
Definieren einer SQLite-Entität
Öffnen Sie die Datei Person.cs im Ordner Modelle.
Fügen Sie der
Person
-Klasse eineint
-Eigenschaft hinzu, dieId
genannt wird.Eine
string
-Eigenschaft namensName
. Die Klasse sollte wie folgt aussehen:namespace People.Models; public class Person { public int Id { get; set; } public string Name { get; set; } }
Speichern Sie die Datei Person.cs.
Hinzufügen der SQLite-Bibliothek
Klicken Sie in Visual Studio im Projektmappen-Explorer mit der rechten Maustaste auf den Projektknoten Personen.
Klicken Sie im daraufhin angezeigten Kontextmenü auf NuGet-Pakete verwalten.
Suchen und wählen Sie sqlite-net-pcl und dann Installieren aus.
Wenn Sie Visual Studio Code verwenden, öffnen Sie das Terminal und diese Pakete mit den folgenden Befehlen:
dotnet add package sqlite-net-pcl
Hinzufügen von SQLite-Attributen
Fügen Sie in der Datei Person.cs eine
using
-Direktive für denSQLite
-Namespace für diePerson
Klasse hinzu. Mit dieser Direktive können Sie die SQLite-Attribute verwenden.using SQLite; namespace People.Models; public class Person { ... }
Kommentieren Sie die
Person
-Klasse mit dem[Table]
-Attribut, und legen Sie den Tabellennamen aufpeople
fest.Geben Sie die
Id
-Eigenschaft als Primärschlüssel an. Kommentieren Sie sie mit den[PrimaryKey]
- und[AutoIncrement]
-Attributen.Fügen Sie der Eigenschaft
Name
Anmerkungen hinzu. Geben Sie fürMaxLength
250 an. Legen Sie fest, dass jeder Wert in der SpalteUnique
sein soll.Die vollständige Klasse sollte so aussehen:
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; } }
Speichern Sie die Datei Person.cs.
Herstellen der Verbindung mit der Datenbank
Öffnen Sie die Datei PersonRepository.cs.
Untersuchen Sie die Klasse
PersonRepository
. Diese Klasse enthält unvollständigen Skelettcode mitTODO
-Markern, an denen Sie die Funktionalität für den Zugriff auf die Datenbank hinzufügen werden.Fügen Sie der Datei für die Klasse
PersonRepository.cs
eineusing
-Anweisung für die NamespacesSQLite
undPeople.Models
hinzu.Fügen Sie der Klasse oberhalb der
Init
-Funktion ein privatesSQLiteConnection
-Feld hinzu, dasconn
genannt wird.Überprüfen Sie in der Funktion
Init
, obconn
ungleichnull
ist. Wenn das zutrifft, kehren Sie sofort zurück.if (conn != null) return;
Auf diese Weise wird der Initialisierungscode für die SQLite-Datenbank nur einmal ausgeführt.
Initialisieren Sie das Feld
conn
, um mithilfe der Variablen_dbPath
eine Verbindung mit der Datenbank herzustellen.Verwenden Sie die
conn.CreateTable
-Methode, um eine Tabelle zum Speichern vonPerson
-Daten zu erstellen. Die vollständige FunktionInit
sollte so aussehen:using SQLite; using People.Models; ... private SQLiteConnection conn; ... private void Init() { if (conn != null) return; conn = new SQLiteConnection(_dbPath); conn.CreateTable<Person>(); }
Einfügen einer Zeile in die Datenbank
Suchen Sie in der
PersonRepository
-Klasse dieAddNewPerson
-Methode.Ersetzen Sie den Kommentar
TODO
in dieser Methode durch Code, um ein neuesPerson
-Objekt einzufügen. Der Code ruft zuerstInit
auf, um zu überprüfen, ob die Datenbank initialisiert ist, und verwendet dann dieInsert
-Methode desSQLiteConnection
-Objekts. Legen Sie dieresult
-Variable auf den Wert fest, den dieInsert
-Methode zurückgibt, wie im folgenden Code dargestellt wird: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 }); ... } ... }
Abrufen von Zeilen aus der Datenbank
Suchen Sie in der
PersonRepository
-Klasse die MethodeGetAllPeople
.Rufen Sie
Init
auf, um zu überprüfen, ob die Datenbank initialisiert wurde.Verwenden Sie die generische
Table\<T>
-Methode zum Abrufen aller Zeilen in der Tabelle. Geben SiePerson
als Typparameter an.Verwenden Sie die Erweiterungsmethode
ToList()
, um das Ergebnis in eineList\<Person>
-Sammlung umzuwandeln und diese Sammlung zurückzugeben.Fügen Sie die Fehlerbehandlung hinzu, indem Sie Ihren Code in einem
try-catch
-Block umschließen. Wenn ein Fehler auftritt, legen Sie dieStatusMessage
-Eigenschaft auf dieMessage
-Eigenschaft der Ausnahme fest, und geben Sie eine leere Sammlung zurück. Die vollständige Methode sollte so aussehen: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>(); }
Speichern Sie die Datei PersonRepository.cs.
Integrieren des Repositorys in die Benutzeroberfläche
Öffnen Sie die Datei MauiProgram.cs.
Fügen Sie in der Funktion
CreateMauiApp
hinter den Anweisungen, die der App die SeiteMainPage
als Singleton-Dienst hinzufügen, Code zur Ausführung der folgenden Aufgaben hinzu:Erstellen Sie eine Zeichenfolgenvariable namens
dbPath
. Initialisieren Sie diese Zeichenfolge mit dem AusdruckFileAccessHelper.GetLocalFilePath("people.db3")
. Die von der App verwendete Datenbankdatei heißt people.db3, und die App speichert diese Datei im lokalen Speicher auf dem Gerät.Verwenden Sie die Abhängigkeitsinjektion, um der App die Klasse
PersonRepository
als Singleton-Dienst hinzuzufügen. Die KlassePersonRepository
macht einen Konstruktor verfügbar, der den Pfad zur Datenbankdatei als Zeichenfolgenparameter übernimmt.
Der fertige Code für die
CreateMauiApp
-Funktion sollte wie folgt aussehen: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(); }
Öffnen Sie die Datei MauiProgram.cs.
Erweitern Sie App.xaml im Projektmappen-Explorer, und öffnen Sie dann die Datei App.xaml.cs.
Fügen Sie eine
public
undstatic
Eigenschaft namensPersonRepo
hinzu. Diese Eigenschaft enthält einPersonRepository
-Objekt in derApp
-Klasse.Initialisieren Sie die Eigenschaft
PersonRepo
im Konstruktor, indem Sie ihm einenPersonRepository
-Parameter hinzufügen und die Eigenschaft ‚PersonRepo‘ auf den Wert in diesem Parameter festlegen. Die vollständigeApp
-Klasse sollte so aussehen:public partial class App : Application { public static PersonRepository PersonRepo { get; private set; } public App(PersonRepository repo) { InitializeComponent(); PersonRepo = repo; } }
Hinweis
Der Abhängigkeitseinfügungsprozess füllt den repo
-Parameter automatisch dem Konstruktor auf.
Testen der App
Erstellen Sie die Projektmappe, indem Sie STRG+UMSCHALT+B drücken.
Beginnen Sie nach Abschluss des Builds mit dem Debuggen, indem Sie auf F5 drücken. Wenn die Benutzeroberfläche angezeigt wird, geben Sie Ihren Namen ein, und klicken Sie auf Person hinzufügen.
Klicken Sie auf Alle Personen abrufen und überprüfen Sie, ob Ihr Name angezeigt wird.
Experimentieren Sie, indem Sie weitere Namen hinzufügen und die Liste von gespeicherten Personen abrufen.
Kehren Sie zu Visual Studio oder Visual Studio Code zurück und beenden Sie das Debugging mit der Tastenkombination UMSCHALT+F5.
Starten Sie die App neu, und wählen Sie Alle Personen abrufen aus. Überprüfen Sie, ob die zuvor gespeicherten Namen in der Datenbank weiterhin gespeichert sind. Schließen Sie die App, wenn Sie fertig sind.