LiveCode-Einsteiger finden sich schnell in die besondere Art der Programmierung hinein. Eine schöne App designen, die einzelnen Elemente mit Skripten versehen: Schritt für Schritt wird es immer einfacher, und wer das Prinzip einmal richtig verinnerlicht hat, wird bald in der Lage sein, eigene Ideen solide umzusetzen.

Aber vor einem Thema haben viele Anfänger großen Respekt, wie ich auch aus Zuschriften ersehe: Wie ist es mit Datenbanken? Kann LiveCode sowas auch - und wichtiger: Kann man das auch als Nicht-Profi mit LiveCode selber hinkriegen?

Zunächst einmal: Yes, we can! Für LiveCode sind Datenbanken überhaupt kein Problem, und mit den richtigen Rezepten ist der Einstieg gar nicht so schwer. Vielleicht will man sich nur mit einer bestehenden Datenbank verbinden und die Ergebnisse mit LiveCode auslesen oder bearbeiten? Oder man will von Grund auf eine eigene Datenbankanwendung erstellen? In diesem Artikel möchte ich allen EInsteigern eine erste Anleitung geben, wie sie LiveCode dazu verwenden können, um mit einer Datenbank zu arbeiten.

Klar, man sollte sich erst einmal ein wenig damit beschäftigen, was eine Datenbank eigentlich ist. Dieses Grundwissen ist Voraussetzung, um sich mit LiveCode an Datenbanken heranzumachen.

Es gibt zwei wesentliche Arten von Datenbanken, mit denen LiveCode besonders unkompliziert arbeitet: Zum einen die am häufigsten verwendete Server-Datenbank mySQL, die auch in den meisten Online-Systemen zum Einsatz kommt. In normalen Webhosting-Paketen ist heutzutage das mySQL-Paket enthalten, so dass man auf seinem Server schnell und einfach eine Datenbank einrichten kann. mySQL wird vor allem dann verwendet, wenn ein und dieselbe Datenbank online für mehrere Benutzer erreichbar sein soll. Das heißt, wenn eine zentrale Datenbank für alle Benutzer eingerichtet wird, auf die dann jede einzelne App zugreifen kann.

Die andere Möglichkeit ist noch einfacher: SQlite-Datenbanken bestehen nur aus einer einzigen Datenbankdatei und benötigen keinen Server. Sie werden vor allem in mobilen Apps eingesetzt, wenn die Datenbank nicht online sein soll, sondern lokal verwendet wird - zum Beispiel, wenn der Benutzer mit einem Programm seine eigene Datensammlung aufbauen möchte (wie ein privates Adressbuch) oder das Programm alle seine Daten mitbringt, die offline verfügbar sein sollen (wie ein mitgeliefertes Wörterbuch).

Der Unterschied beider Datenbanken besteht also darin, dass die mySQL-Datenbank in der Regel auf einem Online-Server liegt und dort von einem unabhängigen Serverprogramm verwaltet wird und die LiveCode-App ihr Anfragen und Befehle schickt, die dieser Server dann ausführt. Die SQlite-Datenbank hingegen wird intern von den in LiveCode enthaltenen Treibern angesteuert und befindet sich meist lokal im Paket der App selber. Aber in der Praxis werden beide Arten von Datenbanken im Wesentlichen mit den gleichen SQL-Befehlen gesteuert, so dass die Skripte in LiveCode nahezu identisch sind, egal, ob man eine mySQL-Datenbank oder SQlite verwaltet. Nur der Verbindungsaufbau zur Datenbank läuft für jeden Typ etwas anders ab.

Wie erstelle ich eine Datenbank?

Um eine SQlite-Datenbank zu erstellen, empfiehlt es sich, einen SQlite-Editor auf dem PC oder im Webbrowser zu installieren (sehr gut geeignet ist zum Beispiel das Firefox-Plugin "SQlite-Manager", das man sich schnell und kostelos im Firefox-Browser über Add-Ons installieren kann). Hier kann man eine Datenbankdatei anlegen und in dieser dann Tabellen erstellen und Felder erstellen sowie alle Daten verwalten.

Um eine Serverdatenbank vom Typ mySQL zu erstellen, sollte man auf seinem Webserver das Tool phpMyAdmin installieren und starten. In Webhosting-Paketen ist dieses mySQL-Verwaltungstool meist schon enthalten und kann über die Administration des Webpakets aufgerufen werden, wo auch in der Regel die Datenbank angelegt wird. Mehr Informationen darüber, wie eine mySQL-Datenbank angelegt und konfiguriert wird, kann man auf den Hilfeseiten des jeweiligen Webhosters erhalten - oder in zahlreichen Web-Anleitungen.

Klassische relationale Datenbanken (das gilt für beide Typen, die hier angesprochen wurden) bestehen aus einem Datenbanknamen (bei mySQL auch einem Benutzer und einem Login) - und aus Tabellen (mit Namen) und jede Tabelle besteht wiederum aus einzelnen Datenfeldern (die jeweils auch wieder eigene Namen haben). Um zum Beispiel eine einfache Personenverwaltung zu schreiben, legen wir eine Datenbank an, die zum Beispiel "personendb" heißt. Darin legen wir eine Tabelle an mit dem Titel "personendaten", und darin finden sich dann Felder, die heißen beispielsweise "id", "nachname", "vorname", "strasse", "plz", "ort", "email, "telefon". Das Feld "id" ist dabei vom Typ "integer" (Ganzzahl) und wird beim Einrichten gleich als primärer Schlüssel mit AUTO_INCREMENT angelegt. Das heißt, dieser Wert wird automatisch für jeden neu hinzugefügten um 1 erhöht, so dass jeder Eintrag in der Datenbank eine eigene ID hat. Die anderen Felder sind vom Typ "text" bzw. "varchar" (also Zeichenketten).

Wenn wir nun neue Datensätze in der Datenbank "personendb" und dort in der Tabelle "personendaten" anlegen, dann wird in diesem Eintrag für jedes der definierten Felder ein Wert gespeichert, den wir der Datenbank zuweisen. So kann man sich relationale Datenbanktabellen auch einfach wie eine Excel-Liste vorstellen. Jede Spalte hat eine Überschrift mit dem Namen des Feldes, und jede Zeile der Liste ist ein sogenannter Datensatz. (Die gesamte Datenbank fasst dabei oft mehrere unterschiedliche Listen zusammen, die bei fortgeschrittenen Datenbankoperationen auch miteinander verknüpft werden können). Das Praktische an der Datenbank ist, dass wir mittels der SQL-Befehle sehr leicht neue Zeilen anlegen können, vorhandene Datensätze ändern oder löschen können und eine oder mehrere Zeilen aus der Liste herausfiltern können, die den gewünschten Kriterien entsprechen. Wir fragen die Datenbank nach den gerade benötigten Daten, und die Datenbank liefert sie uns. Da Datenbanken ihre eigene Sprache sprechen, nämlich SQL (Server Query Language), muss LiveCode auch diese entsprechenden SQL-Befehle an die Datenbank schicken. Wir müssen am Anfang erst einmal nur vier SQL-Befehle lernen, mit denen wir fast alles machen können: Den SELECT-Befehl (Daten auswählen), den INSERT-Befehl (neuen Datensatz einfügen), sowie UPDATE (Daten aktualisieren) und DELETE (Datensatz löschen). Für die meisten Operationen reicht das schon aus.

Wie steuert man nun eine Datenbank mit LiveCode?

Nachdem wir eine Datenbank angelegt haben (als Beispiel die Personendatenbank, die oben beschrieben wurde), müssen wir Folgendes in LiveCode durchführen.

Mit der Datenbank verbinden

Bevor wir auf die Datenbank zugreifen können, muss LiveCode sich mit der Datenbank verbinden. Das geschieht durch den Befehl revOpenDatabase..

put revOpenDatabase("sqlite", dateiPfad, , , , ) into dbid

Hiermit wird die Verbindung zu einer SQlite-Datenbank hergestellt. Mehr wird nicht benötigt - der Datenbankname ist bei SQlite identisch mit dem Namen der Datenbankdatei. Für dateiPfad muss also der Pfad zur vorher angelegten SQlite-Datenbankdatei eingetragen werden, und die Variable dbid steht für "Verbindungs-ID" - mit dieser ID wird dann jede weitere Datenbankoperation durchgeführt. Es empfiehlt sich,diese Variable als global zu deklarieren, falls man sie möglicherweise in unterschiedlichen Skripten verwenden möchte. So kann man die Verbindung zur Datenbank auch gut in ein eigenes Skript mit dem Namen "dbConnect" oder ähnlich schreiben.

Für mySQL sieht der Befehl folgendermaßen aus:

put revOpenDatabase("mysql", "www.server.com", dbName, userName, passWort) into dbid

Bei einer Server-Datenbank wie mySQL braucht man ein paar mehr Parameter, um die Verbindung aufzubauen. Der Servername muss drinstehen, der Name der Datenbank (dbName), der Datenbankbenutzer, der dort eingetragen ist und das dazugehörige Passwort. In der Variable dbid steht dann wiederum die Connection-ID der Datenbank, mit deren Hilfe man alle weiteren Operationen durchführen kann.

Nach erfolgreicher Verbindung steht in der Variable dbid eine Zahl - die ID der Verbindung. Wenn dort etwas anderes steht - zum Beispiel eine Fehlermeldung, dann hat der Verbindungsaufbau zur Datenbank nicht funktioniert, und man sollte die Parameter noch einmal genau überprüfen.

Operationen durchführen

Nachdem die Verbindung zur Datenbank steht, unterscheiden sich die eigentlichen SQL-Befehle, jedenfalls die wesentlichen, bei den beiden Typen von Datenbanken nicht mehr voneinander. Alle Standardoperationen lassen sich mit simplen SQL-Befehlen durchführen.

Daten auswählen

Zum Auswählen von bestimmten Daten aus einer Datenbank wird die SQL-Anweisung "SELECT" verwendet. In SQL sieht das zum Beispiel folgendermaßen aus:

SELECT vorname,nachname,telefon FROM personendaten

Damit würden alle Nachnamen, Vornamen und Telefonnummern aus der Personentabelle herausgeholt und als strukturierte Liste zurückgegeben.

Wie senden wir diese SQL-Anweisung jetzt an LiveCode und erhalten dann die Ergebnisliste zurück? Ganz einfach, zum Beispiel so:

put "SELECT vorname,nachname,telefon FROM personendaten" into sql
put revDataFromQuery(tab,return,dbid,sql) into ergebnis

Der Übersicht halber schreiben wir die SQL-Anweisung erst einmal in die Variable sql. Dann wird diese Anweisung mit der LiveCode-Funktion revDataFromQuery an die Datenbank gesendet. Dabei werden vier Parameter benötigt: Erst die beiden Trennzeichen für Datenfelder und Datensätze, hier tab und return (Felder werden voneinander durch den Tabulator getrennt, Datensätze mit dem RETURN-Zeichen, so dass jede Zeile einen Datensatz enthält). Danach folgt die Verbindungs-ID, die beim Verbinden mit der Datenbank erstellt wurde, danach die SQL-Anweisung, die in der verbundenen Datenbank ausgeführt werden soll.

Die Variable ergebnis enthält jetzt einen Text, eine Liste der Daten aus den gelesenen Feldern, getrennt durch Tab und RETURN. SIe kann jetzt in LiveCode weiter verarbeitet werden. DIe Anzahl der gefundenen Datensätze (hier Personen) ermitteln wir zum Beispiel so:

put the number of lines of ergebnis into anzahl

Auch kann man diese erhaltene Liste sehr einfach in einer vorher auf dem Stack angelegten DataGrid-Tabelle anzeigen:

set the dgtext of group "myDataGrid" to ergebnis

Dies funktioniert, wenn wir wie oben die Trennzeichen auf TAB und RETURN gesetzt haben, denn genau mit diesen Trennern arbeitet die DataGrid-Tabelle intern auch.

Um auf ein einzelnes Element zuzugreifen, können wir mit LiveCode so vorgehen:

set the itemDelimiter to tab
put item 2 of line 3 of ergebnis into nachname

So greifen wir auf den Nachnamen des 3. Eintrags unserer Liste zu.

Wenn wir ganz einfach alle Datenfelder aus einer Tabelle abrufen wollen, geht die SQL-Anweisung so:

SELECT * FROM personendaten

Meistens wollen wir aber eine bestimmte Zeile abrufen oder alle Daten, auf die bestimmte Bedingungen zutreffen. Dazu können wir dem SELECT-Befehl eine Bedingung mitgeben:

SELECT name, vorname FROM personendaten WHERE id = 7

Hier werden alle Datensätze ( = Zeilen aus der Tabelle) komplett geliefert, bei denen die id=7 ist (meistens ist das genau eine Zeile, außer verschiedene Zeilen können die gleich id haben).

Oder:

SELECT * FROM personendaten WHERE vorname > "" ORDER by nachname

Im letzten Beispiel werden die Ergebnisse (alle Zeilen, in denen ein Vorname eingetragen ist) dank der ORDER BY Anweisung auch noch nach dem Nachnamen sortiert.
Die Möglichkeiten sind sehr vielfältig. Um alle Kombinationen, die in SQL möglich sind, zu erfahren, helfen die Beispiele und Übersichten aus den im Web vorhandenen Tutorials zu SQlite und mySQL weiter.

Neue Daten in eine Datenbank einfügen

Um einen neuen Datensatz in die Datenbank einzufügen (also zum Beispiel hier eine neue Person anzulegen) benötigen wir die INSERT-Anweisung in SQL. Wollen wir zum Beispiel eine Person mit Vornamen, Nachnamen und Telefon der Datenbank hinzufügen, sieht die SQL-Anweisung so aus:

INSERT INTO personendaten (nachname,vorname,telefon) VALUES ('Mayer','Erwin','1074-324344')

Hierdurch wird der Tabelle personendaten ein neuer Datensatz hinzugefügt (da die id auf AUTOINCREMENT gesetzt ist, erhält dieser Datensatz gleich eine neue einmalige id), und die übergebenen Werte werden in der Reihenfolge in die Felder eingetragen, in denen die Felder aufgeführt sind. Zu beachten ist, dass  Werte für TEXT oder VARCHAR Felder in Anführungsstrichen übergeben werden (es funktionieren einfache oder doppelte Anführungsstriche, einfache sind aber für die Kombination mit LiveCode von Vorteil). Werte für Zahlen (INTEGER) werden ohne Anführungsstriche übergeben.

In LiveCode wird dieser Befehl folgendermaßen übermittelt:

put "INSERT INTO personendaten (nachname,vorname,telefon) VALUES ('Mayer','Erwin','1074-324344')" into sql
revExecuteSQL dbid, sql

Der Befehl revExecuteSQL wird immer dann verwendet, wenn eine SQL-Anweisung ausgeführt werden soll, die keine Daten zurückliefert.

Bestehende Daten in einer Datenbank ändern

Wenn wir Daten aktualisieren wollen oder zu einem Datensatz noch nicht eingetragene Felder hinzufügen wollen, dann geht das mit der UPDATE-Anweisung. Sie wird folgendermaßen verwendet:

UPDATE personendaten SET email='erwin@mayer.de' WHERE nachname = 'Mayer' AND vorname = 'Erwin'

Hierdurch würde der EIntrag email für alle Datensätze, in denen der Vorname 'Erwin' steht und der Nachname 'Mayer' auf die angegebene E-Mail-Adresse aktualisiert - egal, ob der Eintrag E-Mail vorher leer war oder etwas anderes enthielt.

In LiveCode sieht das dann also folgendermaßen aus:

put "UPDATE personendaten SET email='erwin@mayer.de' WHERE nachname = 'Mayer' AND vorname = 'Erwin'" into sql
revExecuteSQL dbid, sql

Datensätze aus der Datenbank löschen

Um einen oder mehrere Datensätze (=Tabellenzeilen) aus einer Datenbank zu löschen, verwenden wir die DELETE-Anweisung.

DELETE FROM personendaten WHERE id=2

DIeser Befehl löscht alle Datensätze aus der Tabelle personendaten, bei denen die id=2 ist (in der Regel ist das eine Zeile, wenn die id nicht mehrfach verwendet wird).

Der DELETE-Befehl löscht immer alle kompletten Datensätze, bei denen die Bedingung zutrifft. Ohne Bedingung würde der gesamte Inhalt der Datenbank gelöscht.

Auch dieser Befehl nochmal in LiveCode-Fassung:

put "DELETE FROM personendaten WHERE id=2" into sql
revExecuteSQL dbid, sql

Datenbankverbindung beenden

Nach erfolgten Datenbankoperationen empfiehlt es sich, die Datenbankverbindung, die beim Öffnen der Datenbank hergestellt wurde, wieder zu schließen. Das geschieht mit dem folgenden LiveCode-Befehl:

revCloseDatabase dbid

Und damit ist der Zugriff beendet. In der Praxis wird man vor jeder Datenbankoperation in LiveCode die Verbindung herstellen und die dbid speichern, nach der Ausführung des SQL-Befehls wird diese Verbindung wieder geschlossen. Wenn das Programm aber ständig immer wieder auf dieselbe Datenbank zugreifen muss, kann die Verbindung auch bei Programmstart erstellt werden und am Programmende erst wieder geschlossen.

Dies also eine erste Hilfe zum EInstieg in das Arbeiten mit Datenbanken in LiveCode. Natürlich kann man im fortgeschrittenen Stadium mit Datenbanken noch viel mehr machen - zum Beispiel Daten aus verschiedenen Tabellen miteinander verknüpfen, komplexere Bedingungen für die Abfrage, Grupperierung und Sortierung erstellen und mit sehr umfangreichen Datensammlungen schnell und souverän agieren. Mit zunehmenden SQL-Kenntnissen steht dieser Weg auch LiveCode-Programmierern in vollem Umfang offen!

Und jetzt viel Erfolg beim Experimentieren mit Datenbanken in LiveCode. Feedback ist willkommen!