web-dev-qa-db-fra.com

Pouvons-nous connecter une base de données MySQL distante dans Android avec JDBC?

Je développe une application client-serveur qui nécessite une connexion à une base de données distante.

Je sais que des tutoriels sur le Web et que de plus en plus de gens utilisent PHP pour interagir avec MySQL. Mais, je ne suis pas très bon en PHP et mon expérience antérieure est avec Core Java, Swing et JDBC.

Quelqu'un peut-il me guider s'il est possible de connecter une base de données MySQL distante à l'aide d'API JDBC Java dans une application Android?

5
Fenil

En gros: vous pouvez vous connecter à votre serveur MySQL (ou à tout ce que vous utilisez), mais vous ne devriez pas le faire directement depuis votre application Android.

Les raisons:

  1. Les applications Android peuvent être décompilées et le client disposera d'informations d'identification pour accéder à votre base de données. Si vous utilisez les outils de piratage appropriés, tels que Backtrack , ce client malveillant peut accéder aux données de votre base de données, les connecter et les exploiter.

  2. Si votre application est destinée à des clients du monde entier, ces derniers doivent ouvrir et maintenir une connexion à votre base de données par opération ou ensemble d'opérations. L’ouverture d’une connexion physique à une base de données prend beaucoup de temps, même lorsque votre client pc est sur un réseau local à côté du serveur du moteur de base de données. Maintenant, imaginez ouvrir une connexion depuis un pays de l’autre côté du monde, par exemple. La Chine ou le Japon ou d'un pays d'Amérique du Sud comme le Brésil ou le Pérou (où j'habite).

Pour ces 2 raisons que je peux trouver, c’est une mauvaise idée même d’essayer de vous connecter à MySQL ou à n’importe quel autre moteur de base de données directement à partir de votre appareil téléphonique.

Comment résoudre ce problème? Utilisez une architecture orientée services où vous aurez au moins deux applications:

  1. Application du fournisseur de service. Cette application crée et publie des services Web (de préférence RESTful) et peut établir des politiques d'utilisation des services Web tels que l'authentification et l'autorisation des utilisateurs. Cette application se connectera également à la base de données et exécutera les opérations CRUD correspondantes.

  2. Application consommateur de service. Ce serait votre application Android (ou tout autre mobile).

D'après votre question, vous vous concentrez sur le point 1. Comme je l'ai dit dans mes commentaires, vous pouvez créer une application Web en Java, créer un service RESTful à cet endroit, qui se résume à un POJO (ancien objet Java pur) qui a une méthode par service. Dans cette méthode, puisqu'il s'agit bien de Java, vous pouvez ajouter d'autres fonctionnalités telles que l'utilisation de JDBC.

Voici un exemple de lancement utilisant Jersey, Jackson (bibliothèque JSON) et 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;
    }
}

Vous pouvez rechercher d'autres configurations de l'application Web Java dans un didacticiel tel que mkyong's ou Vogella's ou n'importe lequel de vos semblables (c'est trop d'informations à placer dans cette réponse).

Notez que cette application peut ensuite évoluer en une application en couches et que le code JDBC sera intégré à une classe DAO, puis que la classe ProductRestService aura accès à la base de données via cette classe DAO. Voici un autre exemple de coup d'envoi:

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();
    }
}

Et vous pouvez appliquer d'autres modifications à ce projet et à son évolution.

Pouvez-vous me dire ce que PHP fait ici? (si je développe avec PHP)

Au lieu d'écrire l'application du fournisseur de services en Java (comme indiqué ci-dessus), vous pouvez le faire en PHP. Ou en Python, Ruby, C #, Scala ou tout autre langage de programmation qui vous fournit cette technologie. Encore une fois, je ne suis pas sûr du type de tutoriel que vous lisez, mais cela devrait être expliqué quelque part et expliquer que pour les besoins de ce tutoriel, vous allez créer les services en utilisant PHP. Si vous vous sentez plus à l'aise pour écrire ces services en Java plutôt que dans PHP ou tout autre langage, aucun problème. Votre application Android ne se soucie pas vraiment de la technologie utilisée pour produire les services Web, elle se souciera seulement de consommer les services et de ce que les données qui en proviennent peuvent être consommées.

26
Luiggi Mendoza

Il est possible de le faire mais pas recommandé. Je l'ai déjà fait car j'étais dans le même bateau que vous et je vais donc partager du code.

J'ai utilisé cette jar jdbc spécifiquement: https://www.dropbox.com/s/wr06rtjqv0q1vgs/mysql-connector-Java-3.0.17-ga-bin.jar?dl=0

maintenant pour le 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
        }
    }

Maintenant pour ma tâche asynchrone:

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();
        }
    }
}

Assurez-vous d'inclure les autorisations Internet dans le manifeste. Si vous en avez, n'hésitez pas à poser d'autres questions sur mon code.

7
Aaron C

Vous ne pouvez pas accéder nativement à une base de données MySQL à partir d'Android. EDIT: En fait, vous pourrez peut-être utiliser JDBC, mais ce n’est pas recommandé (ou peut ne pas fonctionner?) ... voir Android JDBC ne fonctionne pas: ClassNotFoundException sur le pilote

Voir

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 ne peut pas se connecter directement au serveur de base de données. Par conséquent, nous Devons créer un service Web simple qui transmettra les demandes à la base de données Et renverra la réponse.

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

Pour la plupart des [bons] utilisateurs, cela pourrait aller. Mais imaginez un pirate informatique qui s'empare de votre programme. J'ai décompilé mes propres applications et c'est effrayant ce que j'ai vu. Et s'ils obtenaient votre nom d'utilisateur/mot de passe dans votre base de données et causaient des ravages? Mal.

2
stacktry