web-dev-qa-db-de.com

Können wir eine Remote-MySQL-Datenbank in Android mithilfe von JDBC verbinden?

Ich entwickle eine Client-Server-Anwendung, die eine entfernte Datenbankverbindung erfordert.

Ich weiß, dass Tutorials im Web und mehr Leute PHP verwenden, um mit MySQL zu interagieren. Aber ich bin nicht so gut in PHP und ich habe bereits Erfahrung mit Core Java, Swing und JDBC.

Kann mich jemand anleiten, ob es möglich ist, eine Remote-MySQL-Datenbank mithilfe von Java-JDBC-APIs in einer Android-Anwendung zu verbinden?

5
Fenil

Grundsätzlich: Sie können eine Verbindung zu Ihrem MySQL-Server (oder zu einem beliebigen anderen Server) herstellen, aber Sie sollten dies nicht direkt von Ihrer Android-Anwendung aus tun.

Gründe dafür:

  1. Android-Anwendungen können dekompiliert werden, und der Client verfügt über Anmeldeinformationen für den Zugriff auf Ihre Datenbank. Wenn Sie die richtigen Hacking-Tools wie Backtrack verwenden, kann dieser böswillige Client auf die Daten in Ihrer Datenbank zugreifen, eine Verbindung herstellen und diese ausnutzen.

  2. Wenn Ihre Anwendung für Clients auf der ganzen Welt gedacht ist, sollten die Clients pro Vorgang oder Vorgangssatz eine Verbindung zu Ihrer Datenbank herstellen. Das Öffnen einer physischen Datenbankverbindung nimmt viel Zeit in Anspruch, auch wenn sich Ihr PC-Client in einem LAN neben dem Datenbank-Engine-Server befindet. Stellen Sie sich nun vor, Sie öffnen eine Verbindung von einem Land auf der anderen Seite der Welt, z. China oder Japan oder aus einem Land in Südamerika wie Brasilien oder Peru (wo ich wohne).

Aus diesen zwei Gründen kann ich sagen, dass es eine schlechte Idee ist, sogar eine Verbindung zu MySQL oder einer anderen Datenbank-Engine direkt von Ihrem Telefongerät aus herzustellen.

Wie löse ich dieses Problem? Verwenden Sie eine serviceorientierte Architektur, in der Sie mindestens zwei Anwendungen haben:

  1. Dienstanbieteranwendung. Diese Anwendung erstellt und veröffentlicht Webdienste (vorzugsweise RESTful) und kann Richtlinien für die Nutzung der Webdienste wie Benutzerauthentifizierung und Autorisierung festlegen. Diese Anwendung stellt auch eine Verbindung zur Datenbank her und führt CRUD-Vorgänge für sie aus.

  2. Service-Verbraucheranwendung. Dies wäre Ihre Android-Anwendung (oder eine andere mobile Anwendung).

Von deiner Frage aus konzentrierst du dich auf den Punkt 1. Wie ich in meinen Kommentaren gesagt habe, kannst du eine Webanwendung in Java erstellen, dort einen RESTful-Dienst erstellen, der auf ein POJO (einfaches altes Java-Objekt) hinausläuft hat eine Methode pro Dienst. Bei dieser Methode können Sie, da es sich um reines Java handelt, andere Funktionen wie die JDBC-Verwendung hinzufügen.

Hier ist ein Kickoff-Beispiel mit Jersey, Jackson (JSON-Bibliothek) und JDBC:

@Path("/product")
public class ProductRestService {

    @GET
    @Path("/list")
    @Produces(MediaType.APPLICATION_JSON)
    public List<Product> getProducts() {
        List<Product> productList = new ArrayList<>();
        Connection con = ...; //retrieve your database connection
        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT id, name FROM product");
        while (rs.next()) {
            Product product = new Product();
            product.setId(rs.getInt("id"));
            product.setName(rs.getString("name"));
            productList.add(product);
        }
        //ALWAYS close the resources
        rs.close();
        stmt.close();
        conn.close();
        return productList;
    }
}

Sie können in einem Lernprogramm nach weiteren Konfigurationen der Java-Webanwendung suchen, z. B. mkyong's oder Vogella oder einer anderen Ihrer Art (es sind zu viele Informationen, die in dieser Antwort enthalten sind).

Beachten Sie, dass sich diese Anwendung dann zu einer mehrschichtigen Anwendung entwickeln kann und der JDBC-Code in eine DAO-Klasse umgewandelt wird. Anschließend greift die ProductRestService-Klasse über diese DAO-Klasse auf die Datenbank zu. Hier ist ein weiteres Kickoff-Beispiel:

public class ProductDao {
    public List<Product> getProducts() {
        List<Product> productList = new ArrayList<>();
        Connection con = ...; //retrieve your database connection
        //the rest of the code explained above...
        return productList;
    }
}

@Path("/product")
public class ProductRestService {
    @GET
    @Path("/list")
    @Produces(MediaType.APPLICATION_JSON)
    public List<Product> getProducts() {
        ProductDao productDao = new ProductDao();
        return productDao.getProducts();
    }
}

Sie können andere Änderungen an diesem Projekt vornehmen und sich weiterentwickeln.

Kannst du mir sagen, was PHP hier macht? (wenn ich mit PHP entwickle)

Anstatt die Service Provider-Anwendung in Java zu schreiben (wie oben gezeigt), können Sie dies auch in PHP tun. Oder in Python, Ruby, C #, Scala oder einer anderen Programmiersprache, die diese Technologie für Sie bereitstellt. Ich bin mir nicht sicher, welche Art von Tutorial Sie gerade lesen, aber Sie sollten dies irgendwo erklären und erklären, dass Sie die Services für dieses Tutorial mit PHP erstellen werden. Wenn Sie sich beim Schreiben dieser Dienste in Java lieber fühlen als in PHP oder einer anderen Sprache, ist dies kein Problem. Ihre Android-App interessiert sich nicht wirklich dafür, welche Technologie für die Erstellung der Web-Services verwendet wird. Es wird nur darauf geachtet, dass die Services genutzt werden und dass die Daten von ihnen verwendet werden können.

26
Luiggi Mendoza

Es ist möglich, aber nicht empfohlen. Ich habe es schon einmal gemacht, weil ich im selben Boot war wie Sie, also werde ich Ihnen den Code mitteilen.

Ich habe dieses jdbc-Glas speziell verwendet: https://www.dropbox.com/s/wr06rtjqv0q1vgs/mysql-connector-Java-3.0.17-ga-bin.jar?dl=0

jetzt für den Code:

    package com.example.test.databaseapp;
    import Java.sql.DriverManager;
    import Java.sql.SQLException;

    import Android.app.Activity;
    import Android.content.Context;
    import Android.os.AsyncTask;

    public class MainActivity extends Activity {
        static final String url = "jdbc:mysql://x.x.x.x:xxxx/DBNAME";
        static final String user = "client";
        static final String pass = "password";
        public static List<objClass> objList;


        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            new Download(MainActivity.this, internalUrl).execute(); //async task for getting data from db
        }
    }

Nun zu meiner Async-Aufgabe:

public class Download extends AsyncTask<Void, Void, String> {
    ProgressDialog mProgressDialog;
    Context context;
    private String url;

    public Download(Context context, String url) {
        this.context = context;
        this.url = url;
    }

    protected void onPreExecute() {
        mProgressDialog = ProgressDialog.show(context, "",
                "Please wait, getting database...");
    }

    protected String doInBackground(Void... params) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Java.sql.Connection con = DriverManager.getConnection(url, user, pass);
            Java.sql.Statement st = con.createStatement();
            Java.sql.ResultSet rs = st.executeQuery("select * from table");
            list = new ArrayList<objClass>();

            while (rs.next()) {
                String field= rs.getString("field");
                MainActivity.playerList.add(new objectClass(field));
            }      
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return "Complete";
    }

    protected void onPostExecute(String result) {
        if (result.equals("Complete")) {
            mProgressDialog.dismiss();
        }
    }
}

Stellen Sie sicher, dass Sie Internetberechtigungen in das Manifest aufnehmen. Sie können gerne weitere Fragen zu meinem Code stellen, wenn Sie welche haben.

7
Aaron C

Sie können von Android aus nicht auf eine MySQL-Datenbank zugreifen. BEARBEITEN: Eigentlich können Sie JDBC verwenden, aber es wird nicht empfohlen (oder funktioniert möglicherweise nicht?) ... siehe Android JDBC funktioniert nicht: ClassNotFoundException on driver

Sehen

http://www.helloandroid.com/tutorials/connecting-mysql-database

http://www.basic4ppc.com/forum/basic4Android-getting-started-tutorials/8339-connect-Android-mysql-database-tutorial.html

Android kann keine direkte Verbindung zum Datenbankserver herstellen. Daher müssen wir Einen einfachen Webservice erstellen, der die Anforderungen an die Datenbank Weiterleitet und die Antwort zurückgibt.

http://codeoncloud.blogspot.com/2012/03/Android-mysql-client.html

Für die meisten [guten] Benutzer könnte dies in Ordnung sein. Aber stellen Sie sich vor, Sie würden einen Hacker bekommen, der Ihr Programm in die Finger bekommt. Ich habe meine eigenen Anwendungen dekompiliert und es ist unheimlich, was ich gesehen habe. Was ist, wenn sie Ihren Benutzernamen/Ihr Passwort in Ihre Datenbank aufnehmen und Chaos anrichten? Schlecht.

2
stacktry