web-dev-qa-db-fra.com

Connexion à MySQL depuis Android avec JDBC

J'ai utilisé le code suivant pour connecter MySQL dans localhost depuis Android. Il affiche uniquement les actions indiquées dans la section catch. Je ne sais pas si c'est un problème de connexion ou non. 

package com.test1;

import Java.sql.Connection;
import Java.sql.DriverManager;
import Java.sql.PreparedStatement;
import Java.sql.ResultSet;

import Android.app.Activity;
import Android.os.Bundle;
import Android.widget.TextView;

public class Test1Activity extends Activity {
    /** Called when the activity is first created. */
    String str="new";
    static ResultSet rs;
    static PreparedStatement st;
    static Connection con;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        final   TextView tv=(TextView)findViewById(R.id.user);

        try
        {
            Class.forName("com.mysql.jdbc.Driver");
              con=DriverManager.getConnection("jdbc:mysql://10.0.2.2:8080/example","root","");
            st=con.prepareStatement("select * from country where id=1");
            rs=st.executeQuery();
             while(rs.next())
             {
             str=rs.getString(2);


             }


            tv.setText(str);
            setContentView(tv);
        }
        catch(Exception e)
        {
            tv.setText(str);
        }
    }
}

Lorsque ce code s'exécute, il affiche "nouveau" dans l'avd.

Java.lang.management.ManagementFactory.getThreadMXBean, referenced from method com.mysql.jdbc.MysqlIO.appendDeadlockStatusInformation
Could not find class 'javax.naming.StringRefAddr', referenced from method com.mysql.jdbc.ConnectionPropertiesImpl$ConnectionProperty.storeTo
Could not find method javax.naming.Reference.get, referenced from method com.mysql.jdbc.ConnectionPropertiesImpl$ConnectionProperty.initializeFrom

Quelqu'un peut-il suggérer une solution? Et merci d'avance

11
manuraphy

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 besoin de créer un service Web simple qui transmettra les demandes au base de données et retournera 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.

11
Jack

ce code fonctionne en permanence !!! créé par diko (Turquie) 

public void mysql() {

    try {
        Class.forName("com.mysql.jdbc.Driver");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();

    }

    thrd1 = new Thread(new Runnable() {
        public void run() {
            while (!Thread.interrupted()) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e1) {

                }
                if (con == null) {
                    try {
                        con = DriverManager.getConnection("jdbc:mysql://192.168.1.45:3306/deneme", "ALi", "12345");

                    } catch (SQLException e) {
                        e.printStackTrace();
                        con = null;
                    }

                    if ((thrd2 != null) && (!thrd2.isAlive()))
                        thrd2.start();

                }
            }

        }
    });
    if ((thrd1 != null) && (!thrd1.isAlive())) thrd1.start();

    thrd2 = new Thread(new Runnable() {
        public void run() {
            while (!Thread.interrupted()) {

                if (con != null) {
                    try {
                     //   con = DriverManager.getConnection("jdbc:mysql://192.168.1.45:3306/deneme", "ALi", "12345");
                        Statement st = con.createStatement();
                        String ALi = "'fff'";
                        st.execute("INSERT INTO deneme (name) VALUES(" + ALi + ")");
                      //  ResultSet rs = st.executeQuery("select * from deneme");
                      //  ResultSetMetaData rsmd = rs.getMetaData();
                      //  String result = new String();


                      //  while (rs.next()) {
                      //      result += rsmd.getColumnName(1) + ": " + rs.getInt(1) + "\n";
                     //       result += rsmd.getColumnName(2) + ": " + rs.getString(2) + "\n";


                     //   }

                    } catch (SQLException e) {
                        e.printStackTrace();
                        con = null;
                    }

                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    try {
                        Thread.sleep(300);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

    });


}
4
Ali

Si vous avez besoin de connecter votre application à un serveur, vous pouvez le faire via PHP/MySQL et JSON http://www.androidhive.info/2012/05/how-to-connect-Android-with-php-mysql/ .Mysql Le code de connexion doit être en classe AsynTask. Ne l'exécutez pas dans le fil principal.

2
Arun

Voulez-vous conserver votre base de données sur mobile? Utilisez sqlite au lieu de mysql.

Si l’idée est de conserver la base de données sur le serveur et d’y accéder depuis un mobile. Utilisez un service Web pour récupérer/modifier des données.

0
Kamal

essayez de changer dans le fichier gradle le targetSdkVersion à 8

targetSdkVersion 8
0
David Untama

Une autre approche consiste à utiliser un pilote JDBC virtuel utilisant une architecture à trois niveaux: votre code JDBC est envoyé via HTTP à un servlet distant qui filtre le code JDBC (configuration et sécurité) avant de le transmettre au pilote JDBC MySql. Le résultat vous est renvoyé via HTTP. Certains logiciels libres utilisent cette technique. Juste Google "Pilote Android JDBC sur HTTP".

0
kaw
public void testDB() {
        TextView tv = (TextView) this.findViewById(R.id.tv_data);
        try {

            Class.forName("com.mysql.jdbc.Driver");

            // perfect

            // localhost

            /*
             * Connection con = DriverManager .getConnection(
             * "jdbc:mysql://192.168.1.5:3306/databasename?user=root&password=123"
             * );
             */

            // online testing

            Connection con = DriverManager
                    .getConnection("jdbc:mysql://173.5.128.104:3306/vokyak_heyou?user=viowryk_hiweser&password=123");

            String result = "Database connection success\n";
            Statement st = con.createStatement();

            ResultSet rs = st.executeQuery("select * from tablename ");
            ResultSetMetaData rsmd = rs.getMetaData();

            while (rs.next()) {

                result += rsmd.getColumnName(1) + ": " + rs.getString(1) + "\n";

            }
            tv.setText(result);
        } catch (Exception e) {
            e.printStackTrace();
            tv.setText(e.toString());
        }

    }
0
user3252230