Android App mit einer MySQL Datenbank verbinden (16.01.2016)

In diesem Tutorial möchte ich gerne mein bestehendes
Tutorial „Android App mit MySQL Datenbank verbinden“ erweitern und mit einem konkreten Beispiel verfeinern.

Das bestehende Tutorial dient dabei als Grundlage (es ist jedoch keine Vorraussetzung dieses zu kennen.).

Entwicklungsumgebung

Als IDE verwende ich das Android Studio.

Verwendete Version des Android Studio's.
Verwendete Version des Android Studio’s.

Diese kann unter folgender Adresse „http://developer.android.com/sdk/“ herunter geladen werden (ca. 1.1 GB ohne Updates).

Nachdem die IDE installiert wurde und ggf. die Updates für die neuen Android Versionen eingespielt wurden kann ein neues Projekt erstellt werden.

Erstellen des Android Projektes „SimpleMySQLConnectionApp“

Als erstes muss man das Projekt in der IDE erstellen dieses geht am einfachsten mit dem Wizard welcher einen durch die Fenster führt.

Startfenster des Android Studio's.
Startfenster des Android Studio’s.

In diesem Fenster wählen Sie den Menüpunkt „Start a new Android Studio project“.

Konfiguration des neuen Projektes.
Konfiguration des neuen Projektes.

Geben Sie hier nun

  • Application name – der Name der Android Anwendung
  • Company Domain – dieses wird unser default Pakage
  • Project location – Ablageort der Sourcen
    • dieser Pfad darf nicht zu lang und
    • es dürfen keine Leerzeichen im Pfad benutzt werden

ein.

Plattform einstellen.
Plattform einstellen.

Als Zielplattform verwende ich mindestens die Android Version 4.4.
In diesem Dialog könnte man noch andere Plattformen definieren welches für dieses Tutorial jedoch zu viel overhead erzeugen würde.

Erstes Fenster (Activity) erzeugen.
Erstes Fenster (Activity) erzeugen.

In diesem Dialog kann das aussehen der App definiert werden, zbsp. kann man hier auch wählen das Tabs verwendet werden oder mann kann eine fertige Vorlage (Login Activity) erstellen lassen.

Leeres Hauptfenster einstellen.
Leeres Hauptfenster einstellen.

Ich wähle hier eine leere Activity da es für dieses Beispiel nur eine Ausgabe auf der Activity geben soll.

In diesem Dialog geben Sie

  • Activity Name – der Name der zu erstellenden Activity ein
    • späterer Dateiname der *.java Datei
  • Layout Name – der Name der Layout Datei
    • späterer Dateiname der *.xml Datei
  • Titel – der Titel der Anwendung
  • Menu Resource Name – Name des Menüs welches für diese Activity angelegt werden soll.
Abschluss des Wizards für das erstellen eines neuen Android Studio Projektes.
Abschluss des Wizards für das erstellen eines neuen Android Studio Projektes.

Nachdem alle Eingaben  getätigt wurden und der Wizard mit der Schaltfäche „Finish“ beendet wurde wird das Projekt angelegt. Je nach Rechner kann dieses etwas dauern.

Es kann ggf. vorkommen das die IDE eine Fehlermeldung nach dem Starten erzeugt, dieses liegt in den meisten fällen daran dass, das Kompilieren des Projektes noch nicht abgeschlossen ist und somit noch nicht alle Sourcen zur Verfügung stehen.

Erstellen der Datenquelle für die Activity

Die Datenquelle für die Activity wird wie folgt erstellt.

Erstellen der Datei „ActivityDataSource.java“

Es wird eine Java Klasse erstellt (vorzugsweise in einem separaten Pakage) welche die Abstrakte Klasse AsyncTask erweitert. Die abstrakte Klasse AsyncTask zwingt einem nun die Methode „doInBackground“ zu implementieren welche wir später für das Lesen der Daten benötigen.

App Berechtigungen einstellen

Für die nächsten Schritte müssen die App Berechtigungen eingestellt bzw. verändert werden. Dieses wird für die Benutzung des Internets bzw. des Netzwerkes benötigt.

Die Berechtigungen (auf Englisch „permission“) werden in der Datei „AndroidManifest.xml“ gesetzt (siehe Grafik.)

Android Manifest Datei.
Android Manifest Datei.

Berechtigung zum Zugriff auf das Internet

Berechtigung zum lesen des Netzwerk Statuses

Erstellen der Methoden zum verbinden zur Schnittstelle

Folgende Methode erstellt die URL mit den benötigten Parametern und öffnet eine Verbindung zu dieser mit einer URLConnection.

Lesen des Ergebnisses aus der geöffneten URLConnection

Im vorherigen Schritt haben wir eine Verbindung geöffnet und einen Befehl abgesetzt, unsere PHP Schnittstelle hat aus diesem Befehl einen Output generiert welchen wir nun lesen und ggf. parsen können / müssen.

Die gesamte Klasse „ActivityDataSource.java“

Hier nun die gesamte Klasse.

Im Konstruktor wird hier ein TextView Objekt erwartet welches im letzten Schritt „onPostExceute“ befüllt wird.

Erstellen des Layouts für die App

Da das Ziel dieser App das darstellen eines Wertes aus einer Datenbank ist wird das Layout sehr minimal ausfallen. Jedoch hat die IDE ein komplexes Layout vorbereitet welches wir wiefolgt überschreiben. (Copy & Paste)

Dieses Layout beinhaltet

  • ein TextFeld
  • eine Schaltfläche

und mehr benötige ich für dieses Tutorial nicht.

Erstellen / Erweitern der Klasse Hauptfenser.java

Auch die Klasse Hauptfenster.java kann wie folgt eingekürzt werden da der „Rest“ für dieses Tutorial unnötig ist.

Erstellen der Aktion für die Schaltfläche „lesenBtn“

Die Schaltfläche soll dazu dienen das die lesen Aktion angestoßen wird. Da dieses über einen asyncronen Task geschieht ist mit einer gewissen Verzögerung zu rechnen.
Die Zeit welche der asyncrone Task benötigt werden beeinflusst von:

  • Geräteleistung,
  • Internet geschwindigkeit, Netzwerkverbindung,
  • Auslastung des Servers, sowie
  • verwendeter Quellcode

Folgender Code wird nun implementiert.

Hier ist gut zusehen das wir „nur“ der Klasse ActivityDataSource im Konstruktor das TextView Objekt übergeben müssen und den Prozess mit „dataSource.execute();“ starten.
Der Methode „execute“ können eine beliebige Anzahl (VarArg) von Parametern übergeben werden welche in der Methode „doInBackground“ in der Klasse ActivityDataSource ausgewertet und verwendet werden können.

Die gesamte Klasse „Hauptfenster.java“

 

Erstellen der PHP Schnittstelle

Als Schnittstelle dient uns eine PHP Datei welche auf einem Server im Internet läuft
(Im idealfall auf dem selben Server wie auch die Datenbank.)

Erstellen des Verzeichnisses und ablegen der Datei „reader.php“

Mit der Hilfe eines FTP Programmes wird nun das Verzeichnis auf dem gewünschten Server erstellt und die Datei „reader.php“ abgelegt.

PSPAD Editor

Für die weitere Entwicklung in PHP verwende ich den PSPAD Editor welcher kostenlos auf der Herstellerseite http://www.pspad.com/de/ heruntergeladen werden kann.
Der Vorteil dieses Editors ist dass, man Online entwickeln kann, d.h. man baut durch das eingebaute Tool eine FTP Verbindung zum Server auf und kann dort eine Datei bearbeiten und speichern. Die Änderung sind sofort aktiv und müssen nicht erst umständlich hochgeladen werden.

Authentifizierung

Als Sicherheitsmaßnahme habe ich einen authentifizierungsschlüssel implementiert welcher von der App mit in der URL übergeben wird. Dieser wird in der PHP Datei auf gleichheit geprüft und wenn dieser gleich ist (Case Sensitive) dann geht die Prozedure weiter und wenn nicht dann wird die gesamte Prozedure abgebrochen und eine Fehlermeldung ausgegeben.

Fehlender Authentifiziungsschlüssel oder keine erfolgreiche Authentifiziung.
Fehlender Authentifiziungsschlüssel oder keine erfolgreiche Authentifiziung.

In dieser Methode wird zuerst geprüft ob die Parameter „authkey“ und „method“ als POST Parameter vorhanden sind. Wenn diese Vorhanden sind wird geprüft ob der Wert für den Parameter „authkey“ gleich „meinAuth……“ ist. Wenn die Parameter NICHT gesetzt wurden und auch nicht der Key Stimmt dann wird jeweils die Fehlermeldung ausgegeben.

Aufbau der Datenbankverbindung

Nachdem die Authentifizierung erfolgreich war kann nun mit dem aufbau der Datenbankverbindung begonnen werden.

Für die spätere Verwendung der Datenbankverbindung wird diese in eine Variable gespeichert.

Die Funktion „getDBConnection()“ erstellt aus den Werten der Variablen eine Verbindung. Wenn diese nicht erfolgreich ist wird die Fehlermeldung ausgegeben.

Variablen für die Funktion „getDBConnection()“

Tragen Sie hier die Benutzer und Datenbankeinstellungen ein.
(Es wurden hier die originalen Werte entfernt.)

Lesen der Daten aus der MySQL Datenbank mit PHP

Folgende Funktion ließt nun alle Daten aus meiner MySQL Datenbank und gibt diese aus.
Der generierte Output wir mit einem senkrechten Strich getrennt und kann in der Android App an dieser Stelle geparst werden.

Die gesamte Datei „reader.php“

 

Starten der Android Anwendung

Es gibt zwei Möglichkeiten die erstellte Android App zu starten

  • in einem Emulator, oder
  • auf einem „echten“ Gerät.

Ich starte die App’s immer auf einem „echten“ Gerät da man hier genauso gut debuggen sowie gleich die Oberfläche von der Bedienbarkeit mit der Hand prüfen kann.

Möchte man nun die App Starten so klickt man auf die Schaltfläche run.
Nach dem klick öffnet sich das Fenster für die Auswahl des Gerätes.

Geräteauswahl zum starten der Anwendung.
Geräteauswahl zum starten der Anwendung.

Nachdem dieses Fenster mit der Schaltfläche „OK“ bestätigt wurde, wird die Anwendung auf das Gerät kopiert, deployt und gestartet. Den gesamten Vorgang kann man in der Konsole verfolgen.

Ändern der SDK Ziel Version

Sollte es hier vorkommen dass, das Gerät in der List nicht unterstützt wird muss soweit dieses natürlich der verwendete Quellcode es zu läßt die SDK Version geändert werden. Diese Änderung der Version wird in der Datei „build.gradle“ durch geführt. (siehe Grafik)

Gradle build Datei.
Gradle build Datei.

Da ich als Zielgerät ein Samsung Galaxy S2 Plus verwende muss ich den Wert für „minSdkVersion“ von 19 auf 17 ändern. Da die Änderung erst kompiliert und das Projekt erneut gebaut werden muss, „erkennt“ dieses die IDE und erzeugt folgende Warnung am oberen Rand der Datei.

Warung, Gradle build "out of sync"
Warung, Gradle build „out of sync“

 

Ausgabe auf der Activity in der App

Wenn nun die App gestartet wird, wird folgender Bildschirm angezeigt.

Startbildschirm der Android App.
Startbildschirm der Android App.

Bei einem „klick“ auf die Schaltfläche „Lesen“ wird eine Verbidnung aufgebaut und die Daten aus der MySQL Datenbank geholt.

Daten aus der MySQL Datenbank.
Daten aus der MySQL Datenbank.

Diese Daten können nun ganz einfach geparst werden und in einer Liste oder ähnlichem dargestellt werden.

Das gesamte Android Studio Projekt zum Download

Verwandte Beiträge

27 Kommentare

  1. Hallo!
    Erstmal vielen Dank für dein aktuelles Tutorial (Es wahr das einzige welches ich gefunden habe, das dazu noch up-to-date ist!)
    Es ist alles sehr gut erklärt finde ich, sodass ich alles verstehen konnte 😀

    Trotzdem habe ich eine kleine Frage: Ich will die Datenbank quasi in einen String „auslesen“ und ich wüsste jetzt nach ausprobieren nicht mehr wie ich das anstellen soll, deswegen habe ich mich entschlossen einfach mal zu fragen. :’D

    MfG
    Erik S.

  2. Ich suche genau nach DIESER Lösung -allerdings bin ich in der Abfolge deines Tutorials oftmals verwirrt, weil ich an vielen Punkten nicht weiss, in welche Datei ich nun WAS eintragen soll… Es geht schon los unter dem Punkt: Erstellen der Datei „ActivityDataSource.java“ Muss ich diese Datei neu erstellen? Wie mache ich das? Eine step-by-step Anleitung wäre mir hier viel hilfreicher….

    • Edit: Ich habe es nun hinbekommen, nachdem ich mein Projekt genau so benannt habe, wie du deines. Nun habe ich allerdings noch eine Frage: wie kann ich jetzt die Ausgabe vernünftig formatieren? HTML-Formatierung ist in der foreach ja nicht möglich. Ich möchte zb. nach jedem Datensatz einen Zeilenumbruch generieren…(??)

      • ich bin mir nicht sicher ob es dir noch hilft aber wenn du in der PHP Datei an der Stelle echo „|“ das | durch \n ersetzt dann macht dann sollte die Datei an dieser Stelle ein Zeilenumbruch machen.

        mit freundlichen güßen Thomas

  3. Super Tutorial danke!
    Nur leider wenn ich auf Lesen tippe passiert nichts…irgendein Tipp woran das liegen könnte? Wenn ich die Url so aufrufe habe ich eine Verbindung.

  4. Ich habe mal eine Frage, wenn ich auf den Knopf in der App drücke bekomme ich ganz viel css code ausgegeben und unter anderem die Fehlermeldung undefinded index: de_name in users/***/www/reader.php
    Ich bitte um Hilfe.
    Zur Info: ich verwende meine eigene Datenbank

    • Hi,

      das sieht nach einem PHP Fehler aus, dazu müsste man aber zusätzlich noch die Datei ansehen.
      Wenn du möchtest kannst du mir ja mal die Daten per E-Mail zusenden.

      Gruß,

      Stefan

  5. Hi Stefan,

    ich habe das Projekt gerade nachgebaut und komme nicht so recht weiter. Wen ich den Button lesen betätige, erhalte ich nicht den Output der Datenbank sondern folgendes: Array(1){[„authkey“]=> string(7) „test321“}
    Hast Du einen Tipp für mich, was da falsch läuft? Vielen dank im Voraus!

    • Hi,

      der Parameter „authkey“ ist falsch.
      Über welche URL rufst du den Service auf?

      Hier musst du prüfen

      if (isset($_POST[‚authkey‘]) AND isset($_POST[‚method‘])){
      $authkey = $_POST[‚authkey‘];
      if ($authkey != ‚test321‘){
      die($authkey);
      }
      } else {
      die(var_dump($_POST));
      }

      Gruß,

      Stefan
      Gruß,

      Stefan

  6. Hi Stefan,

    ich habe in die reader.php genau Deinen Code hineinkopiert:

    function checkAuthCode(){
    $fehler0 = „Fehler 0: Keine erfolgreiche Authentifizierung!“;
    if (isset($_POST[‚authkey‘]) AND isset($_POST[‚method‘])){
    $authkey = $_POST[‚authkey‘];
    if ($authkey != ‚test321‘){
    die($authkey);
    }
    } else {
    die(var_dump($_POST));
    }
    Dennoch erhalte ich die selbe Fehlermeldung. Die php liegt auf einem Webserver im Heimnetz, auf dem auch der MySQL Server läuft. Wenn ich die php über einen browser aufrufe, erhalte ich folgenden Output:

    array(0) { }

    Danke für Deine Hilfe!!

    • Hi,

      wie und vorallem mit welchen Parametern rufst du den „Service“ auf?

      Es scheint so das der erwartete Parameter „authcode“ fehlt.

      Gruß,

      Stefan

  7. Hi wenn ich in der reader.php
    die (var_dump($_POST));
    durch
    echo „TEST“;
    ersetze, erhalte ich im Browser und auch auf einem Android tablet als Ausgabe
    TEST.
    ich weiß nicht genau, „Aufruf des Service“ bedeutet, erfolgt der über Hauptfenster.java?
    Gruß Marius

    • Hi,

      es wird in der Methode “ private void openConnection()“ eine Adresse genannt diese muss existieren, des weiteren werden POST Parameter übergeben. Hast du lokal ein XAMPP laufen?

      Gruß,

      Stefan

  8. Hi Stefan,
    hier die Methode:
    private void openConnection() throws IOException{
    //StringBuffer für das zusammensetzen der URL
    StringBuffer dataBuffer = new StringBuffer();
    dataBuffer.append( URLEncoder.encode(„authkey“, „UTF-8“));
    dataBuffer.append(POST_PARAM_KEYVALUE_SEPARATOR);
    dataBuffer.append(URLEncoder.encode(AUTHKEY, „UTF-8“));
    dataBuffer.append(POST_PARAM_SEPARATOR);
    dataBuffer.append(URLEncoder.encode(„method“, „UTF-8“));
    dataBuffer.append(POST_PARAM_SEPARATOR);
    dataBuffer.append(URLEncoder.encode(DESTINATION_METHOD, „UTF-8“));
    //Adresse der PHP Schnittstelle für die Verbindung zur MySQL Datenbank
    URL url = new URL(„http://192.168.178.110/android/reader.php“);
    conn = url.openConnection();
    conn.setDoOutput(true);
    OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
    wr.write(dataBuffer.toString());
    wr.flush();
    }
    Unter 192.168.178.110 läuft eine Linuxmaschine mit Webserver und MySQL.

    • Hi,
      das sieht gut aus.
      Was passiert wenn du die Adresse „http://192.168.178.110/android/reader.php“ im Browser öffnest?
      Man könnte auch die Adresse und die Parameter in Postman mal aufrufen. Das gibt es als Browserplugin sowie als eigenständige Anwendung.

      Das leere Array array(0) { } zeigt eigentlich an das keine POST Parameter ankommen.

      Gruß,
      Stefan

      • Hi Stefan,

        Danke für den Tip. Wenn ich mit postman einen POST request sende und im Bereich url encoded die Parameter für authkey und Methode mitgebe, dann erhalte ich im Browser das korrekte Ergebnis der DB Abfrage. Wenn ich den Parameter Methode weglasse, erhalte ich wie zuvor beschrieben „ array(1) { [„authkey“]=> string(7) „test321“ }„. Also scheint bei der Übergabe der Methode etwas falsch zu sein?
        Danke und Gruß
        Marius

        • Hi Stefan, ich habe den Fehler gefunden: in der Methode wird
          method&allEntrys übergeben,es muss aber method=allEntrys ankommen.Falscher Seperator. Also in Deinem Beispiel muss in Zeile 13
          folgender Code stehen:
          dataBuffer.append(POST_PARAM_KEYVALUE_SEPARATOR);

          Kannst Du mir noch eien Tipp geben, wie ich das auf einem Android Tablett schön als Tabelle ausgeben kann?
          Danke & Gruß
          marius

          • Hi,

            danke für den Hinweis.
            Möchtest du das in der Android App oder im Browser darstellen?

            Gruß,

            Stefan

  9. Hi,
    Ich möchte am liebsten das Ergebnis des select statements in der Android App als Tabelle darstellen, also mit mehreren Spalten und Zeilen.

    Vg
    Marius

    • Hi,

      es gibt das TableLayout in Android damit kann man das lösen.
      Als Anfang würde ich das Ergebnis des SQL Statements als JSON zurück geben,
      dieses kann man zbsp. mit Google GSON parsen und bequem in Objekten darstellen.

      Wenn das Ergebnis als Liste mit Objekten vorliegt kann man nun mit einer For Each Schleife
      (oder stream je nach Ziel SDK) darüber iterieren und eine neue Zeile erzeugen (TableRow),
      jeder Wert aus dem Objekt wird eine neue TextView und wird der Zeile hinzugefügt. Am Ende wird die Zeile dem
      TableLayout hinzugefügt.

      Damit sollte dann eine Tabelle dargestellt werden.

      Gruß,

      Stefan

  10. „Als Schnittstelle dient uns eine PHP Datei welche auf einem Server im Internet läuft
    (Im idealfall auf dem selben Server wie auch die Datenbank.)“
    Super! Sehr hilfreich.
    Und weiter?
    Kommt etwa PHP-Datei alleine zum Server sobald sie die Notwendigkeit riecht?

    • Hallo,

      bitte beschreiben Sie das Problem etwas genauer?
      Im nächsten Abschnitt wird erläutert wie die Schnittstelle erstellt und wo diese abgelegt wird.

      Gruß,

      Stefan

  11. Leider funktioniert der Code bei mir nicht, ich konnte es mittlerweile soweit eingrenzen, dass der Fehler wohl im OutputStreamWriter liegt. Hier kommt immer die Fehlermeldung: „W/System.err: java.io.FileNotFoundException: http://XXX/reader.php

    Sobald ich wr.flush() auskommentiere, kommt die zu erwartende Rückmeldung: „array(0){}“

    Hat hier einer eine Idee woran das liegen kann?

    Gruß
    Christian

  12. Hallo Stefan,

    nach langem hin und her, hat sich soeben herausgestellt das es sich um einen serverseitigen Fehler handelt. Auf dem betroffendem Server war POST abgeschaltet.

    Vielen Dank für das gute Tutorial, jetzt funktioniert alles 🙂

    Gruß
    Christian

Antworten

Deine E-Mail-Adresse wird nicht veröffentlicht.


*