Verwenden einer SQLite-Datenbank in einer UWP-App
Sie können SQLite verwenden, um Daten in einer leichten Datenbank auf dem Gerät des Benutzers zu speichern und abzurufen. In diesem Handbuch wird gezeigt, wie das geht.
Einige Vorteile der Verwendung von SQLite für lokalen Speicher
✔️ SQLite ist leicht und eigenständig. Es ist eine Codebibliothek ohne andere Abhängigkeiten. Es gibt nichts zu konfigurieren.
✔️ Es gibt keinen Datenbankserver. Der Client und der Server werden im selben Prozess ausgeführt.
✔️ SQLite befindet sich in der öffentlichen Domäne, sodass Sie sie frei verwenden und mit Ihrer App verteilen können.
✔️ SQLite arbeitet plattform- und architekturübergreifend.
Weitere Informationen zu SQLite finden Sie hier.
Auswählen einer Abstraktionsebene
Wir empfehlen, dass Sie entweder Entity Framework Core oder die Open-Source-SQLite-Bibliothek von Microsoft verwenden.
Entity Framework Core
Entity Framework (EF) ist ein objektrelationaler Mapper, mit dem Sie mithilfe domänenspezifischer Objekte mit relationalen Daten arbeiten können. Wenn Sie dieses Framework bereits für die Arbeit mit Daten in anderen .NET-Apps verwendet haben, können Sie diesen Code in eine UWP-App migrieren. Es funktioniert mit entsprechenden Änderungen an der Verbindungszeichenfolge.
Um es auszuprobieren, siehe Erste Schritte mit EF Core.
SQLite-Bibliothek
Die Microsoft.Data.Sqlite--Bibliothek implementiert die Schnittstellen im System.Data.Common--Namespace. Microsoft pflegt diese Implementierungen aktiv und bietet einen intuitiven Wrapper für die native SQLite-API auf niedriger Ebene.
Der Rest dieses Handbuchs hilft Ihnen bei der Verwendung dieser Bibliothek.
Richten Sie Ihre Lösung so ein, dass sie die Microsoft.Data.SQlite-Bibliothek verwendet.
Wir beginnen mit einem einfachen UWP-Projekt und installieren dann die entsprechenden Nuget-Pakete.
Anmerkung
Stellen Sie sicher, dass Sie das Microsoft.Data.Sqlite' package and not 'Microsoft.Data.Sqlite.Core
installieren. Dieses Paket installiert Microsoft.Data.Sqlite.Core
als eine Abhängigkeit.
Alle unterstützten Versionen von Windows unterstützen SQLite, sodass Ihre App keine SQLite-Bibliotheken verpacken muss. Stattdessen kann Ihre App die Version von SQLite verwenden, die mit Windows installiert ist. Dies hilft Ihnen auf verschiedene Weise.
✔️ Reduziert die Größe Ihrer Anwendung, da Sie die SQLite-Binärdatei nicht herunterladen und dann als Teil Der Anwendung verpacken müssen.
✔️ Verhindert, dass Sie eine neue Version Ihrer App an Benutzer übertragen müssen, wenn SQLite kritische Korrekturen für Fehler und Sicherheitsrisiken in SQLite veröffentlicht. Die Windows-Version von SQLite wird von Microsoft in Abstimmung mit SQLite.org verwaltet.
✔️ Die App-Ladezeit hat das Potenzial, schneller zu sein, da die SDK-Version von SQLite wahrscheinlich bereits in den Arbeitsspeicher geladen wird.
Beginnen wir mit dem Hinzufügen einer Klasse zu Ihrem UWP-Projekt mit dem Namen DataAccess. Sie können ein .NET Standard-Klassenbibliotheksprojekt verwenden, um Ihren Datenzugriffscode zu enthalten, in unserem Beispiel wird jedoch keins verwendet.
Klicken Sie mit der rechten Maustaste auf die Lösung, und klicken Sie dann auf NuGet-Pakete für Lösungverwalten.
An diesem Punkt haben Sie eine Wahl. Sie können die Version von SQLite verwenden, die in Windows enthalten ist, oder wenn Sie einen Grund haben, eine bestimmte Version von SQLite zu verwenden, können Sie die SQLite-Bibliothek in Ihr Paket einschließen. Wir werden die Version von SQLite verwenden, die in Windows enthalten ist.
Wählen Sie die Registerkarte Durchsuchen aus, suchen Sie nach dem Paket Microsoft.Data.SQLite.Core, und installieren Sie die neueste stabile Version.
Hinzufügen und Abrufen von Daten in einer SQLite-Datenbank
Wir führen die folgenden Aktionen aus:
1️⃣ Vorbereiten der Datenzugriffsklasse.
2️⃣ Initialisieren der SQLite-Datenbank.
3️⃣ Einfügen von Daten in die SQLite-Datenbank.
4️⃣ Abrufen von Daten aus der SQLite-Datenbank.
5️⃣ Fügen Sie eine einfache Benutzeroberfläche hinzu.
Bereite die Datenzugriffsklasse vor
Öffnen Sie die DataAccess
Klasse in Ihrem Projekt, und erstellen Sie diese Klasse statisch.
Anmerkung
Während in unserem Beispiel Datenzugriffscode in einer statischen Klasse platziert wird, handelt es sich lediglich um eine Entwurfsauswahl und ist vollständig optional.
public static class DataAccess
{
}
Fügen Sie die folgenden using-Anweisungen am Anfang dieser Datei hinzu.
using Microsoft.Data.Sqlite;
using System.Collections.Generic;
Initialisieren der SQLite-Datenbank
Fügen Sie der klasse DataAccess
eine Methode hinzu, die die SQLite-Datenbank initialisiert.
public async static void InitializeDatabase()
{
await ApplicationData.Current.LocalFolder.CreateFileAsync("sqliteSample.db", CreationCollisionOption.OpenIfExists);
string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqliteSample.db");
using (SqliteConnection db =
new SqliteConnection($"Filename={dbpath}"))
{
db.Open();
String tableCommand = "CREATE TABLE IF NOT " +
"EXISTS MyTable (Primary_Key INTEGER PRIMARY KEY, " +
"Text_Entry NVARCHAR(2048) NULL)";
SqliteCommand createTable = new SqliteCommand(tableCommand, db);
createTable.ExecuteReader();
}
}
Dieser Code erstellt die SQLite-Datenbank und speichert sie im lokalen Datenspeicher der Anwendung.
In diesem Beispiel benennen wir die Datenbank sqlliteSample.db
, aber Sie können den gewünschten Namen verwenden, solange Sie diesen Namen in allen SqliteConnection- Objekten verwenden, die Sie instanziieren.
Rufen Sie im Konstruktor der datei App.xaml.cs Ihres UWP-Projekts die InitializeDatabase
-Methode der DataAccess
-Klasse auf.
public App()
{
this.InitializeComponent();
this.Suspending += OnSuspending;
DataAccess.InitializeDatabase();
}
Einfügen von Daten in die SQLite-Datenbank
Fügen Sie der DataAccess
-Klasse eine Methode hinzu, die Daten in die SQLite-Datenbank einfügt. Dieser Code verwendet Parameter in der Abfrage, um SQL-Einfügungsangriffe zu verhindern.
public static void AddData(string inputText)
{
string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqliteSample.db");
using (SqliteConnection db =
new SqliteConnection($"Filename={dbpath}"))
{
SQLitePCL.Batteries.Init();
db.Open();
SqliteCommand insertCommand = new SqliteCommand();
insertCommand.Connection = db;
// Use parameterized query to prevent SQL injection attacks
insertCommand.CommandText = "INSERT INTO MyTable VALUES (NULL, @Entry);";
insertCommand.Parameters.AddWithValue("@Entry", inputText);
insertCommand.ExecuteReader();
}
}
Abrufen von Daten aus der SQLite-Datenbank
Fügen Sie eine Methode hinzu, die Datenzeilen aus einer SQLite-Datenbank abruft.
public static List<String> GetData()
{
List<String> entries = new List<string>();
string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqliteSample.db");
using (SqliteConnection db =
new SqliteConnection($"Filename={dbpath}"))
{
db.Open();
SqliteCommand selectCommand = new SqliteCommand
("SELECT Text_Entry from MyTable", db);
SqliteDataReader query = selectCommand.ExecuteReader();
while (query.Read())
{
entries.Add(query.GetString(0));
}
}
return entries;
}
Die Read-Methode durchläuft die Zeilen der zurückgegebenen Daten. Sie gibt true
zurück, wenn noch Zeilen übrig sind, andernfalls false
.
Die GetString--Methode gibt den Wert der angegebenen Spalte als Zeichenfolge zurück. Sie akzeptiert einen Ganzzahlwert, der die nullbasierte Spalten-Ordinalzahl der gewünschten Daten darstellt. Sie können ähnliche Methoden wie GetDataTime- und GetBoolean-verwenden. Wählen Sie eine Methode basierend auf dem Datentyp aus, den die Spalte enthält.
Der Ordinalparameter ist in diesem Beispiel nicht so wichtig, da wir alle Einträge in einer einzelnen Spalte auswählen. Wenn jedoch mehrere Spalten Teil Ihrer Abfrage sind, verwenden Sie den Ordnungswert, um die Spalte abzurufen, aus der Sie Daten abrufen möchten.
Hinzufügen einer einfachen Benutzeroberfläche
Fügen Sie in der Datei MainPage.xaml des UWP-Projekts den folgenden XAML-Code hinzu.
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<StackPanel>
<TextBox Name="Input_Box"></TextBox>
<Button Click="AddData">Add</Button>
<ListView Name="Output">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackPanel>
</Grid>
Diese einfache Benutzeroberfläche gibt dem Benutzer eine TextBox
, mit der er eine Zeichenfolge eingeben kann, die wir der SQLite-Datenbank hinzufügen. Wir verbinden den Button
in dieser Benutzeroberfläche mit einem Ereignishandler, der Daten aus der SQLite-Datenbank abruft und diese Daten dann in der ListView
anzeigt.
Fügen Sie in der datei MainPage.xaml.cs den folgenden Handler hinzu. Dies ist die Methode, die wir dem Click
-Ereignis des Button
in der UI zugeordnet haben.
private void AddData(object sender, RoutedEventArgs e)
{
DataAccess.AddData(Input_Box.Text);
Output.ItemsSource = DataAccess.GetData();
}
Außerdem möchten wir sicherstellen, dass alle vorhandenen Daten geladen werden, wenn die Anwendung gestartet wird. Fügen Sie dem MainPage
-Konstruktor eine Codezeile zum Aufrufen von GetData()
hinzu.
public MainPage()
{
this.InitializeComponent();
Output.ItemsSource = DataAccess.GetData();
}
Das war's. Erkunden Sie Microsoft.Data.Sqlite, um zu sehen, welche anderen Aktionen Sie mit Ihrer SQLite-Datenbank ausführen können. Schauen Sie sich die nachstehenden Links an, um mehr über andere Möglichkeiten zur Verwendung von Daten in Ihrer UWP-App zu erfahren.
Nächste Schritte
Verbinden Sie Ihre App direkt mit einer SQL Server-Datenbank.
Siehe Verwenden einer SQL Server-Datenbank in einer UWP-App.
Nutzen des gleichen Codes für verschiedene Apps auf verschiedenen Plattformen
Weitere Informationen finden Sie unter Migrieren von einer Desktopanwendung zu UWP.
Hinzufügen von Master/Detail-Seiten mit Azure SQL-Back-Ends
Weitere Informationen finden Sie unter Customers Orders Database sample (Beispiel für eine Kundenauftragsdatenbank).