Dieses Tutorial ist das zweite in einer Reihe über Programmierung SQLite in C..
SQLite speichert eine Sammlung von Tabellen in einer einzigen Datei Datenbank, endet normalerweise mit .db. Jede Tabelle ist wie eine Tabelle, besteht aus mehreren Spalten und jede Zeile hat Werte.
Wenn es hilft, stellen Sie sich jede Zeile als eine vor struct, mit dem Spalten in der Tabelle entsprechend den Feldern in der Struktur.
Eine Tabelle kann so viele Zeilen enthalten, wie auf eine Festplatte passen. Es gibt eine Obergrenze, aber ihre riesigen 18.446.744.073.709.551.616, um genau zu sein.
Eine Tabelle kann bis zu 2.000 Spalten enthalten. Wenn Sie die Quelle neu kompilieren, können Sie sie auf beeindruckende 32.767 Spalten maximieren.
Die SQLite-API
Um SQLite verwenden zu können, müssen wir die API aufrufen. Eine Einführung in diese API finden Sie auf der offiziellen Einführung in die SQLite C / C ++ - Schnittstelle Website. Es ist eine Sammlung von Funktionen und einfach zu bedienen.
Zunächst benötigen wir ein Handle für die Datenbank. Dies ist vom Typ sqlite3 und wird durch einen Aufruf von sqlite3_open (Dateiname, ** ppDB) zurückgegeben. Danach führen wir das aus
SQL.Lassen Sie uns zunächst einen kleinen Exkurs machen und mit SQLiteSpy eine verwendbare Datenbank und einige Tabellen erstellen. (Links dazu und zum SQLite-Datenbankbrowser finden Sie im vorherigen Tutorial.)
Veranstaltungen und Veranstaltungsorte
Die Datenbank über. Die DB wird drei Tische halten, um Veranstaltungen an mehreren Orten zu verwalten. Diese Veranstaltungen werden Partys, Discos und Konzerte sein und an fünf Orten stattfinden (Alpha, Beta, Charlie, Delta und Echo). Wenn Sie so etwas modellieren, ist es oft hilfreich, mit einer Tabelle zu beginnen. Der Einfachheit halber speichere ich nur ein Datum und keine Uhrzeit.
Die Tabelle enthält drei Spalten: Datum, Veranstaltungsort, Ereignistyp und etwa zehn Ereignisse wie dieses. Die Daten laufen vom 21. bis 30. Juni 2013.
Jetzt hat SQLite keinen expliziten Datumstyp, daher ist es einfacher und schneller, ihn als int zu speichern, und genauso wie Excel Datumsangaben (Tage seit dem 1. Januar 1900) verwendet, haben die int-Werte 41446 bis 41455. Wenn Sie die Daten in eine Tabelle einfügen und dann die Datumsspalte als Zahl mit 0 Dezimalstellen formatieren, sieht sie ungefähr so aus:
Jetzt könnten wir diese Daten in einer Tabelle speichern und für ein so einfaches Beispiel wäre es wahrscheinlich akzeptabel. Eine gute Praxis für das Datenbankdesign erfordert jedoch einige Normalisierung.
Eindeutige Datenelemente wie der Veranstaltungsorttyp sollten sich in einer eigenen Tabelle befinden, und die Veranstaltungstypen (Party usw.) sollten sich ebenfalls in einer Tabelle befinden. Da wir mehrere Veranstaltungstypen an mehreren Orten haben können (eine Beziehung von vielen zu vielen), benötigen wir einen dritten Tisch, um diese zu halten.
Die drei Tabellen sind:
- Veranstaltungsorte - hält alle fünf Veranstaltungsorte
- Ereignistypen - Enthält alle drei Ereignistypen
- Ereignisse - Enthält das Datum plus Veranstaltungsort-ID plus Ereignistyp-ID. Ich habe auch ein Beschreibungsfeld für dieses Ereignis hinzugefügt, z. B. "Jim's Birthday".
Die ersten beiden Tabellen enthalten die Datentypen, sodass die Veranstaltungsorte die Namen Alpha zum Echo haben. Ich habe auch eine Ganzzahl-ID hinzugefügt und einen Index dafür erstellt. Mit der geringen Anzahl von Veranstaltungsorten (5) und Veranstaltungstypen (3) könnte dies ohne Index erfolgen, bei größeren Tabellen wird es jedoch sehr langsam. Fügen Sie also für jede Spalte, in der wahrscheinlich gesucht wird, einen Index hinzu, vorzugsweise eine Ganzzahl
Die SQL, um dies zu erstellen, ist:
Der Index in der Ereignistabelle enthält Datum, ID-Ereignis, Ereignistyp und Veranstaltungsort. Das heißt, wir können die Ereignistabelle nach "allen Ereignissen an einem Datum", "allen Ereignissen an einem Veranstaltungsort", "allen Parteien" usw. und Kombinationen von solchen wie "allen Parteien an einem Veranstaltungsort" usw. abfragen.
Nach dem Ausführen der SQL-Abfragen zum Erstellen von Tabellen werden die drei Tabellen erstellt. Hinweis: Ich habe die gesamte SQL in die Textdatei create.sql eingefügt und sie enthält Daten zum Auffüllen einiger der drei Tabellen.
Wenn Sie setzen; Am Ende der Zeilen, wie ich es in create.sql getan habe, können Sie alle Befehle auf einmal stapeln und ausführen. Ohne das; Sie müssen jeden für sich ausführen. Klicken Sie in SQLiteSpy einfach auf F9, um alles auszuführen.
Ich habe auch SQL eingefügt, um alle drei Tabellen mit / * in mehrzeiligen Kommentaren abzulegen. * / wie in C. Wählen Sie einfach die drei Zeilen aus und drücken Sie Strg + F9, um den ausgewählten Text auszuführen.
Diese Befehle fügen die fünf Veranstaltungsorte ein:
Wieder habe ich auskommentierten Text in leere Tabellen eingefügt, mit dem löschen von Linien. Es gibt kein Rückgängigmachen, seien Sie also vorsichtig mit diesen!
Erstaunlicherweise ist bei allen geladenen Daten (zugegebenermaßen nicht viel) die gesamte Datenbankdatei auf der Festplatte nur 7 KB groß.
Ereignisdaten
Anstatt zehn Insert-Anweisungen aufzubauen, habe ich mit Excel eine CSV-Datei für die Ereignisdaten erstellt und verwendete dann das SQLite3-Befehlszeilenprogramm (das mit SQLite geliefert wird) und die folgenden Befehle zum Importieren es.
Hinweis: Jede Zeile mit dem Punkt (.) Ist ein Befehl. Verwenden Sie .help, um alle Befehle anzuzeigen. Um SQL auszuführen, geben Sie es einfach ohne Punktpräfix ein.
Sie müssen für jeden Ordner doppelte Blackslashes \\ im Importpfad verwenden. Führen Sie die letzte Zeile erst aus, nachdem der .import erfolgreich war. Wenn SQLite3 ausgeführt wird, lautet das Standardtrennzeichen a: Daher muss es vor dem Import in ein Komma geändert werden.
Zurück zum Code
Jetzt haben wir eine voll gefüllte Datenbank, schreiben wir die C-Code um diese SQL-Abfrage auszuführen, die eine Liste von Parteien mit Beschreibung, Datum und Ort zurückgibt.
- Neu in SQL? Lesen Was ist SQL?
Dies führt eine Verknüpfung mithilfe der Spalte "idvenue" zwischen der Tabelle "Ereignisse" und "Veranstaltungsorte" durch, sodass der Name des Veranstaltungsortes und nicht der Wert "int idvenue" angezeigt wird.
SQLite C-API-Funktionen
Es gibt viele Funktionen, aber wir brauchen nur eine Handvoll. Die Reihenfolge der Verarbeitung ist:
- Öffnen Sie die Datenbank mit sqlite3_open () und beenden Sie sie, wenn beim Öffnen ein Fehler aufgetreten ist.
- Bereiten Sie die SQL mit sqlite3_prepare () vor
- Schleife mit slqite3_step (), bis keine Datensätze mehr vorhanden sind
- (In der Schleife) Verarbeiten Sie jede Spalte mit sqlite3_column ...
- Rufen Sie schließlich sqlite3_close (db) auf.
Nach dem Aufruf von sqlite3_prepare gibt es einen optionalen Schritt, bei dem alle übergebenen Parameter gebunden werden. Dies wird jedoch für ein zukünftiges Lernprogramm gespeichert.
In dem unten aufgeführten Programm sind die Pseudocodes für die Hauptschritte also:
Das SQL gibt drei Werte zurück. Wenn also sqlite3.step () == SQLITE_ROW ist, werden die Werte aus den entsprechenden Spaltentypen kopiert. Ich habe int und Text verwendet. Ich zeige das Datum als Zahl an, kann es aber in ein Datum umwandeln.
Auflistung des Beispielcodes