Referenz SQLite Wrapper 1

Verwendete Datentypen

Row

Definition:

typedef std::map<std::string,std::string> Row;


Erzeugung im Programm:

SQLite::Row Testrow;



Hier handelt es sich um einen STL-Container vom Typ map, also um ein Schlüsselpaar. Der erste Wert ist der Schlüssel für den zweiten Wert. Um Daten einzufügen geht man z.B. so vor:

Row werte;
werte["Schlüssel1"] = "Wert1";
werte["Schlüssel2"] = "Wert2";

Es gibt viele verschiedene Wege auf Werte in STL Containern zuzugreifen. Weil das hier aber kein Tutorial für STL Container und Iteratoren ist, nur zwei Möglichkeiten. Die erste führt über den Schlüssel:

cout << werte.at("Schlüssel2") << endl;

Das Codeschnipsel würde „Wert1“ auf der Konsole ausgeben. Der zweite Weg führt über die Iteratoren für Container. Mit dem folgenden Codebeispiel kann auf Schlüssel und Wert seperat zugegriffen werden.

for(Row::const_iterator iterator = werte.begin();iterator != werte.end();iterator++)
{
   cout << iterator->first << "=" << iterator->second << endl;
}

Auf der Konsole würde „Schlüssel1=Wert1“ und „Schlüssel2=Wert2“ ausgegeben werden. In einen solchen Map-Container können beliebig viele Wertepaare abgelegt werden, die Datenstuktur wächst dynamisch mit. Ein solches Row repräsentiert in einem Result immer eine Tabellenzeile. Es wird allerdings auch für die Eingabe von Werten benutzt. Der Schlüssel steht für den Spaltennamen und der Wert für den Spaltenwert. Diese Rows werden die nachfolgende Datenstruktur gepackt:

Result

Definition:

typedef std::vector<Row> Result;


Erzeugung im Programm:

SQLite::Result Testresult;



Bei einem Result handelt es sich um einen Vektor-Container, der Rows enthält. Am einfachsten stellt man ihn sich als dynamisches Array vor und man kann ihn auch so ähnlich verwenden: Zugriff über Index:

Result[0]=Row0;
Result[1]=Row1;

Doch genau, wie bei einem Array darf man nicht auf ungültige Indexwerte zugreifen. Um diese Problem zu beheben kann man so vorgehen:

Result.at(0)=Row0;
Result.at(1)=Row1;

Hier wird zuerst überprüft, ob der Index überhaupt gültig ist. Wird versucht auf einen ungültigen Index zuzugreifen, dann wird eine Ausnahme ausgelöst, die man per try und catch abfangen kann. Ein solcher Container kann natürlich auch über Iteratoren durchlaufen werden. Am besten sieht man sich das Anwendungsbeispiel auf der vorherigen Seite einmal genauer an.

Öffentliche Memberfunktionen

Ausführen eines beliebigen SQL-Kommandos

Definition:

Result query( const std::string& query );


Verwendung im Code:

SQLite database;
database.query("SELECT * FROM humans;");



Diese Funktion kann verwendet werden, um ein beliebiges SQL Kommando auszuführen. Sie liefert ein Result als Ergebnis zurück. Wenn das SQL-Kommando Daten aus der Datenbank zurückliefern sollte, sind die Daten im Result enthalten, ansonsten ist es leer. Diese Funktion kann nur ein einzelnes SQL-Kommando ausführen. Es können nur Tabellenwerte zurückgeliefert werden. Diese Funktion greift intern auf die Funktion „check_value“ zu und erzeugt einen Laufzeitfehler, der die SQLite Fehlermeldung enthält, wenn ein Problem bei der Ausführung auftritt, z.B. aufgrund eines Syntaxfehlers im SQL-Kommando. Alle nachfolgenden Funktionen greifen intern auf diese Funktion zurück.

Daten in eine Tabelle einfügen

Definition:

void insert(
const std::string& table,
const Row& values );


Verwendung im Code:

SQLite database;
SQLite Row inserts;
 
inserts["Name"   ] = "Mustermann";
inserts["Vorname"] = "Fritz";
database.insert("Tabellenname",inserts);

entspricht diesem SQL-Kommando:

INSERT INTO Tabellenname (Name,Vorname) VALUES ('Mustermann','Fritz');



Mit dieser Funktion können Werte in die Datenbank eingefügt werden. Jeder Aufruf erzeugt eine neue Zeile in der Tabelle.

Daten auslesen

Definition:

Result select(
const std::string& table,
const Row& values )


Verwendung im Code:

SQLite Database;
SQLite::Row where;
where["Name"   ] = "Mustermann";
where["Vorname"] = "Fritz";
Database.select("Tabellenname",where);

entspricht diesem SQL Kommando:

SELECT * FROM Tabellenname WHERE Name='Mustermann' AND Vorname='Fritz';



Mit diesem Befehl können Daten aus einer Tabelle herausgeholt werden. Die Rückgabe erfolgt als Result.

Daten ändern

Definition:

void update( const std::string& table,
const Row& values,
const std::string& where )


Verwendung im Code

SQLite database;
SQLite::Row updates;
std::string, where;
 
where = "Vorname='Fritz'";
updates["name"] = "Hubermaier";
updates["gehalt"] = "2500";
database.update("Tabellenname",updates,where);

entspricht diesem SQL-Kommando:

 UPDATE Tabellenname SET name='Hubermaier' AND gehalt=2500 WHERE Vorname='Fritz'; 



Mit dieser Funktion können Daten in der Tabelle geändert werden. Es erfolgt keine Datenrückgabe.


Daten löschen

void deleteFrom( const std::string& table,
const std::string& where )


Verwendung im Code:

SQlite database;
 
database.deleteFrom("Tabellenname","Spalte='Wert'");

entspricht diesem SQL Kommando:

DELETE FROM Tabellenname WHERE Spalte='Wert';



Mit dieser Funktion können Daten, die der Wherebedingung entsprechen, aus der Datenbank gelöscht werden