# Zugriff auf entfernten mySQL-Server via Android



## Little Dragon (24. Sep 2013)

Hallo liebe NG,

ich habe folgenden Code unter Java am PC und lokalen Server zum Laufen gebracht. Meine Absicht ist es mit meinem S3 (Android 4.1.2) Daten in einem entfernten mySQL-Server abzulegen. Dazu möchte ich gerne diesen Code entsprechend adaptieren. Dazu hätte ich gerne folgende Fragen an euch gerichtet und hoffe sehr, dass ihr mir helfen könnt.

- Gibt es bei der Abbildung von Java auf Android Einschränkungen, die ich beachten muss?
- Warum dieser DriverManager? Läd er zur Laufzeit einen Treiber? Simuliert er einen mySQL-Clienten um mit der mySQL-Datenbank in Verbindung treten zu können?
- Muss ich den JConnector in mein Androidsystem einbinden damit die VM den JDBC-Treiber findet, darauf zugreifen kann und wie mache ich das?

Mir genügen schon brauchbare Links, die mir weiterhelfen könnten den Zusammenhang zu verstehen. Wenn es aber möglich ist in deutsch, da englische Texte über Dinge die nicht verstehe für mich umständlich zu lesen sind.

Vielen Dank für das wohlwollende Lesen meiner Anfrage.
lg Thomas


```
package client;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Collection {


    public Collection() {
        super();
    }

    public static void main(String[] args) {
        Connection conn = null;
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
        } catch (Exception ex) {
            System.out.println("Class.forNAme: " + ex.toString());
        }
        try {
            conn = DriverManager.getConnection("jdbc:mysql://localhost/gpslogger?user=root");
        } catch (SQLException ex) {
            System.out.println("SQLExeption: " + ex.getMessage());
            System.out.println("SQLSate: " + ex.getSQLState());
            System.out.println("VendoeError: " + ex.getErrorCode());
        }

        Statement stmt = null;
        ResultSet rs = null;

        try {
            try {
                stmt = conn.createStatement();
            } catch (SQLException sqle) {
                // TODO: Add catch code
                System.out.println("conn.createStatement: " + sqle.toString());
                sqle.printStackTrace();
            }
            try {
                rs = stmt.executeQuery("SELECT * FROM gpsdata");
                rs.absolute(3); // nur zum testen
                System.out.println(rs.getString("name")); // und es funktioniert auch
                // Diese Klasse muss noch untersucht werden :-)
                //System.out.println(rs.getArray(1).toString());
            } catch (SQLException sqle) {
                // TODO: Add catch code
                System.out.println("stmt.executeQuery: " + sqle.toString());
                sqle.printStackTrace();
            }
        } finally {
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException sqle) {
                    // TODO: Add catch code
                    System.out.println("rs.close: " + sqle.toString());
                    sqle.printStackTrace();
                }
            }
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException sqle) {
                    // TODO: Add catch code
                    System.out.println("stmt.close: " + sqle.toString());
                    sqle.printStackTrace();
                }
            }
        }
    }
}
```


----------



## dzim (26. Sep 2013)

Also auf diese Art möchtest du ganz sicher nicht von Android auf MySQL zugreifen!

Wie der Name es nahelegt, ist DriverManager etwas, was einen Treiber lädt (JDBC-Treiber). Ich habe gerade keine Entwicklungsumgebung auf und kann es nicht überprüfen, aber da das Android-SDK nicht alles von Java implementiert und seine eigene DB-Abstraktionsschicht hat, werden dir diese wahrscheinlich Mittel sowoeso nicht zur Verfügung stehen und es ist generell eher nicht so gut, von einem Programm irgendwo im Netz direkt auf eine DB zuzugreifen. Inperformant^2!

Du wirst also einen Service (via Web) benötigen, der kann dann als Server dir die Daten der DB zur Verfügung stellen - musst halt "nur" eine Schnittstelle schaffen, wie man Daten holt/schickt.
Java-Mittel wäre mittels Java EE einen WebService via SOAP oder REST zu schreiben - kannst aber auch irgend was anderes nehmen, wie z.B. node.js

Viel Erfolg!


----------



## Little Dragon (26. Sep 2013)

Hi lieber dzim,

vielen Dank für deine Mühe. Wäre eine Verbindung via apache+mysql+php denkbar? Die Anfrage also an eine seite.php per get oder post senden, dort entsprechend in die Datenbank eintragen. Würde sich dann auf meinem Handy ein Browser öffnen?
Ich werde mir deine vorgeschlagenen Ideen ansehen.

mfg Thomas


----------



## dzim (27. Sep 2013)

Wie du letzten Endes die Serverseite gestaltest, ist natürlich dir überlassen. Nimm die Technologie, mit der du am vertrautesten bist - dann geht es halt am schnellsten. Node.js habe ich nur vorgeschlagen, weil es wirklich sehr schlank ist - ich selbst bin kein JavaScript-Fan und würde wohl eher irgendwass aus der Java-Welt nehmen, aber hier sind schlicht und ergreifend nur deine Programmierkenntnisse der entscheidende Faktor.

Bedenke auch: Wenn du deinen Server ins Internet stellst, solltest du ihn auch absichern. HTTPS (dann hat wenigstens nur die NSA was davon  ) und der Einfachheit halber noch BasicAuthentication oder so. Auf der Clientseite (Android) kannst du dann entweder die Java-API verwenden, oder (eher empfohlen) etwas vom Apache- oder Spring-Framework.


----------



## Little Dragon (28. Sep 2013)

Hallo lieber dzim,

ich habe mich nun, auf Grund deines Anratens, etwas intensiver mit den serverseitigen Belangen beschäftigt. Ich sehe nun auch, das dies eine weitaus solidere Basis darstellt und letzten Endes gar nicht so schwer ist. Ich habe mir also GlassFish und Derby zusammmen mit NetBeans installiert, ein paar gute Tutorials angeschaut, sie an meinem Bedarf angepasst und schon hat es funktioniert. Vielen Dank noch einmal für deine Ratschläge, sie haben mich dazu inspiriert einmal über den Tellerrand hinauszusehen und dort gab es viel zu entdecken. :toll:

glg


----------

