SQLite Datenbank für Win8 und WP 8

Dieser Artikel ist ein Gastbeitrag von Dino, welcher sonst für Tech-Impact.de sowie RefreshButton.net Beiträge verfasst. Entwickelt man eine App für Windows Phone bzw. Windows 8, kommt man schnell an den Punkt, an dem man Daten speichern muss. In einem früheren Beitrag wurde die WinRT-Database vorgestellt, mit deren Hilfe sich eine Datenbank simulieren lässt und somit Daten recht einfach gespeichert werden können. Für einfache Anwendungen reicht dies vollkommen aus, es gibt jedoch entscheidende Nachteile gegenüber der SQLite-Database, die in diesem Artikel vorgestellt wird.

Zum einen fehlt die Kompatibilität zu Windows Phone und zum anderen ist das Suchen nach bestimmten Datensätzen innerhalb der Datenbank nicht sonderlich effizient. Ich möchte euch nicht mit Details über SQLite quälen, sei nur gesagt, dass es eine sehr verbreitete DB für mobile Apps ist, die auch für Android, iOS Apps genutzt werden kann. Schauen wir uns lieber an, wie wir das Ganze nutzen können!

1. SQLite Library herunterladen und installieren

Wir öffnen also Visual Studio 2012 und wählen oben im Menü den Menüpunkt Tools -> Erweiterungen und Updates, im nun geöffneten Fenster wählen wir links das Register Online und geben oben rechts in die Suche das Schlüsselwort „SQLite“ ein. In den Suchergebnissen erscheint „SQLite for Windows Runtime“ und „SQLite for Windows Phone„. Mit einem Klick auf Herunterladen wird SQLite installiert und ihr werdet zu einem Neustart von VS2012 aufgefordert. (In diesem Beispiel habe ich SQLite für Windows 8 gewählt und installiert).

sqlite_install

Installation von SQLite

2. Projekt anlegen und SQLite einbinden

Nun wollen wir ein neues Projekt anlegen. Dazu wählen wir den Menüpunkt Datei -> Neu -> Projekt und erstellen ein Windows 8 App Projekt unserer Wahl. Im Projektmappen-Explorer klicken wir rechts auf Verweise und wählen Verweis hinzufügen. In geöffneten Fenster links auf das Register Windows -> Erweiterungen wechseln und das Häkchen bei SQLite for Windows Runtime UND Microsoft Visual C++ Runtime Package setzen! Das Ganze mit einem Klick auf OK bestätigen.

sqlite_projekt

Einbindung in die aktuelle App

Aber siehe da, irgendetwas scheint noch nicht ganz zu stimmen, was uns Visual Studio mit einem Warndreieck gerne mitteilen möchte.

sqlite_warning

Warnung von VS2012

Der Grund hierfür ist, dass SQLite nicht für die Plattform „Any CPU“ kompiliert werden kann, die standardmäßig ausgewählt ist. Das liegt daran, dass für jede Plattform (ARM, x86, x64) eine eigene .dll-Datei existiert. Damit Visual Studio beim Kompilieren weiß, welche Datei zu verwenden ist, müssen wir das noch klar stellen. Im Umkehrschluss bedeutet das, wollt ihr eure App für ARM, x86, x64 anbieten, müsst ihr die App 3 Mal kompilieren mit der jeweils entsprechenden Einstellung. Das klingt aber schlimmer als es ist. Die entsprechende Einstellung finden wir im Menü unter Erstellen -> Konfigurations-Manager. Hier wählen wir unter Plattform für unser Projekt z.B. x86. Mit OK bestätigen wir diese Änderung. Nun sollten die bösen Warndreiecke verschwunden sein. Denkt daran, dass ihr diesen Schritt für jede Plattform, die ihr mit eurer App anpeilt, wiederholen müsst und das Projekt also max. 3 Mal erstellen müsst. Visual Studio erzeugt dann 3 separate App-Packages, die dann bei der Zertifizierung auch alle 3 hochgeladen werden müssen. [Anmerkung: Wir reden hier natürlich von Windows 8 Apps, auf Windows Phone entfällt das Ganze!]

sqlite_plattform

Der Konfigurations-Manager für Windows 8 Apps

3. Fast geschafft!

Damit wir endlich loslegen können, fehlt uns noch eine Kleinigkeit. Im Menü wählen wir Tools -> Bibliotheks-Paket-Manager -> Paket-Manager-Konsole und geben in die Konsole ein „install-package sqlite-net„. Dies fügt unserem Projekt die zwei Source-Dateien SQlite.cs und SQLiteAsync.cs hinzu. Euch bleibt selbst überlassen, wo ihr die asynchronen Methoden nutzt und wo nicht. Geschafft! Wir können jetzt loslegen!

4. Beispiel-Code

Zunächst deklarieren wir in der App.xaml.cs Datei eine statische Variable, die den Pfad zu unserer Datenbank enthält. Es bietet sich an diese im lokalen Speicher der App zu speichern. Davor müssen wir aber noch über using SQLite;  den Namespace verfügbar machen.

In der OnLaunched-Methode ergänzen wir, innerhalb des if(rootFrame == null)-Blocks, folgendes:

Wir setzen also den absoluten Pfad, wobei unsere Datenbank-Datei „meineDatenBank.sqlite“ heißt, und stellen dann eine Verbindung zur Datenbank her. Dann erstellen wir, falls nicht bereits vorhanden, eine Tabelle für den Datentyp Kunde. Nun erstellen wir in unserem Projekt noch eine Datei Kunde.cs, die eine Klasse enthält, welche einen Datensatz innerhalb der Tabelle darstellt:

Diese einfache Klasse dient uns als Vorlage für unsere Tabelle. D.h. unsere Datenbank-Tabelle hat die Felder Id [Primärschlüssel], Vorname und Nachname. Nun fügen wir unserer MainPage noch einige Controls hinzu:

Wir haben also zwei Eingabeboxen für Vorname und Nachname, sowie einen Speichern-Button. Damit speichern wir einen Datensatz. Wir können aber auch über den Suchen Button nach Kunden suchen, die der Eingabe in den Boxen entsprechen. Schauen wir uns nun die Save_Click-Methode in MainPage.xaml.cs an:

Wir stellen eine Verbindung zur Datenbank her und speichern darin einen neuen Kunden, mit den Namen aus den Eingabeboxen. Achtung: Die Id Eigenschaft brauchen wir nicht manuell zu setzen, da es sich hier um unseren Primärschlüssel handelt! Dieser wird automatisch entsprechend gesetzt. Der Integer-Wert insert enthält den neuen Primärschlüssel des gespeicherten Datensatzes. Schauen wir uns nun die Search_Click-Methode an:

Wir stellen erneut eine Verbindung zur Datenbank her und suchen dann nach Kunden, die entweder den eingegeben Vornamen oder den eingegebenen Nachnamen besitzen. Dann fügen wir jeden gefundenen Kunden aus gesuchteKunden in die Ergebnisliste Ergebnisse ein. Wenn ihr das Ganze jetzt kompiliert und ausführt, könnt ihr Kunden abspeichern und dann in eurem Datensatz suchen. Schließt ihr die App wieder und öffnet sie, sind eure Daten immer noch vorhanden!

  SQLite - Demo (1,3 MiB)

Hinweis: Natürlich sieht das alles so noch nicht schön aus. Es fehlt noch ein ItemTemplate für die Ergebnis ListView um die Daten schön darzustellen. Aber ich denke, das kriegt ihr auch ohne mich hin ;)! Wenn noch Fragen offen sind bzgl. der SQLite Datenbank, könnt ihr mich gerne über Thomas Sebastian erreichen!

You may also like...

4 Responses

  1. dee sagt:

    Ihre Demo habe ich als Beispiel herangezogen und bis auf die namen, selbiges abgekupfert. Allerdings kommt bei mir in der ListView appdb.kalendar anstatt der Einträge selbst… ?
    Habe ich etwas übersehen?

  2. Hallo,
    es fehlt scheinbar noch die Angabe eines ItemTemplates, welches für die ListView noch erstellt werden muss. Sonst wird für jedes Element nur der Name der Klasse, also bei Ihnen kalender, ausgegeben. Bei der Eingabe des ItemTemplates können Sie dann selbst entscheiden, wie die Elemente angezeigt werden sollen.
    Viele Grüße
    Sebastian

  3. Piltzl sagt:

    Das ist ein sehr schönes Tutorial. Doch ich versteh nicht, wie ich das in ein HubControl bekomme. Also wie man die Datenbank als DataContext angeben kann.

  4. Hallo,
    hier für eignet sich wohl am Besten ein ViewModels, welche die Daten aus der Datenbank vorhält. Im Beispiel wird hier zum Beispiel die Variable Ergebnisse verwendet.
    Ich hoffe, dass Ihnen meine Ausführungen weiterhelfen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *