Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] MySQL et JDBC

    18 juin 2012 à 16:15:28

    Bonjour, je suis débutant en développement Android.
    Je cherche à me connecter à mon server MySQL depuis l'application directement, sans passé par PHP.

    Voici mon code :

    try
            {
            	
            	try {
    				Class.forName("com.mysql.jdbc.Driver").newInstance();
    				Toast.makeText(this, "Driver OK", Toast.LENGTH_LONG).show();
    			} catch (InstantiationException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} catch (IllegalAccessException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} catch (ClassNotFoundException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			       	
            	
            	String url = "jdbc:mysql://monserveurMySQL/test?autoReconnect=true";
    			String user = "root";
    			String passwd = "monPaaswd";
    			
    			Toast.makeText(this, "Connection ...", Toast.LENGTH_SHORT).show();
    			Connection conn = DriverManager.getConnection(url, user, passwd);
    			Toast.makeText(this, "Connection Etablished", Toast.LENGTH_SHORT).show();
    			
            	
            }
            catch(SQLException e)
            {
            	e.printStackTrace();
            	//Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
                Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
                Log.e("MySQL", e.getMessage());
            }
    



    L'adresse du serveur MySQL ainsi que les identifiants sont correct (pas dans le code au dessus, mais dans le code final).

    Seulement, lorsque je lance mon appli, le pilote s'instancie correctement mais lors de la connection, j'ai le message d'erreur suivant :

    52.421: E/MySQL(8882): Server connection failure during transaction. Due to underlying exception: 'android.os.NetworkOnMainThreadException'.
    06-18 15:22:52.421: E/MySQL(8882): ** BEGIN NESTED EXCEPTION **
    06-18 15:22:52.421: E/MySQL(8882): android.os.NetworkOnMainThreadException
    06-18 15:22:52.421: E/MySQL(8882): STACKTRACE:
    06-18 15:22:52.421: E/MySQL(8882): android.os.NetworkOnMainThreadException
    06-18 15:22:52.421: E/MySQL(8882): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
    06-18 15:22:52.421: E/MySQL(8882): at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
    06-18 15:22:52.421: E/MySQL(8882): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
    06-18 15:22:52.421: E/MySQL(8882): at java.net.InetAddress.getAllByName(InetAddress.java:220)
    06-18 15:22:52.421: E/MySQL(8882): at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:246)
    06-18 15:22:52.421: E/MySQL(8882): at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:271)
    06-18 15:22:52.421: E/MySQL(8882): at com.mysql.jdbc.Connection.createNewIO(Connection.java:2921)
    06-18 15:22:52.421: E/MySQL(8882): at com.mysql.jdbc.Connection.<init>(Connection.java:1555)
    06-18 15:22:52.421: E/MySQL(8882): at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
    06-18 15:22:52.421: E/MySQL(8882): at java.sql.DriverManager.getConnection(DriverManager.java:175)
    06-18 15:22:52.421: E/MySQL(8882): at java.sql.DriverManager.getConnection(DriverManager.java:209)
    06-18 15:22:52.421: E/MySQL(8882): at net.sgn.beta.SGNSplash.onCreate(SGNSplash.java:61)
    06-18 15:22:52.421: E/MySQL(8882): at android.app.Activity.performCreate(Activity.java:4465)
    06-18 15:22:52.421: E/MySQL(8882): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
    06-18 15:22:52.421: E/MySQL(8882): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
    06-18 15:22:52.421: E/MySQL(8882): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
    06-18 15:22:52.421: E/MySQL(8882): at android.app.ActivityThread.access$600(ActivityThread.java:123)
    06-18 15:22:52.421: E/MySQL(8882): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
    06-18 15:22:52.421: E/MySQL(8882): at android.os.Handler.dispatchMessage(Handler.java:99)
    06-18 15:22:52.421: E/MySQL(8882): at android.os.Looper.loop(Looper.java:137)
    06-18 15:22:52.421: E/MySQL(8882): at android.app.ActivityThread.main(ActivityThread.java:4424)
    06-18 15:22:52.421: E/MySQL(8882): at java.lang.reflect.Method.invokeNative(Native Method)
    06-18 15:22:52.421: E/MySQL(8882): at java.lang.reflect.Method.invoke(Method.java:511)
    06-18 15:22:52.421: E/MySQL(8882): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    06-18 15:22:52.421: E/MySQL(8882): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    06-18 15:22:52.421: E/MySQL(8882): at dalvik.system.NativeStart.main(Native Method)
    06-18 15:22:52.421: E/MySQL(8882): ** END NESTED EXCEPTION **
    06-18 15:22:52.421: E/MySQL(8882): Attempted reconnect 3 times. Giving up.


    Est-ce que quelqu'un a déjà rencontrer ce problème ?
    De grâce, merci de votre aide.
    • Partager sur Facebook
    • Partager sur Twitter
      18 juin 2012 à 17:12:07

      Bonjour,

      Es-tu certain que ce n'est pas un problème du côté du serveur ?
      Sur quelle version du système Android tests-tu ton application ?
      • Partager sur Facebook
      • Partager sur Twitter
      Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
        18 juin 2012 à 17:16:54

        Pour ce qui est du serveur, je ne pense pas avoir de souci, j'arrive à m'y connecté depuis un client windows (SQLyog et Workbench).
        La version d'android sur lequel je test est 4.0.3.
        L'application est développé avec l'API 10 (Android 2.3).

        Je me suis renseigné, normalement Android 2.3 intégre jdbc d'origine, mais sans ajouté le pilote jdbc 5.08 de mysql , le Driver ne s'instanciait pas.
        Pareil avec la dernière version de jdbc 5.1.18.
        • Partager sur Facebook
        • Partager sur Twitter
          18 juin 2012 à 17:20:05

          Oui, effectivement, tout cela ne devrait pas poser problème.

          Est-ce que tu exécutes bien ton code dans un thread secondaire ?
          • Partager sur Facebook
          • Partager sur Twitter
          Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
            18 juin 2012 à 17:28:17

            Non, le problème pourrait venir probablement.

            Il me reste juste à trouver comment lancer des thread sous Android :D

            Je vais regarder et tester.

            Merci pour l'information.
            • Partager sur Facebook
            • Partager sur Twitter
              18 juin 2012 à 17:28:59

              Oui, c'est sans doute ça puisque la documentation dit ceci :

              Citation

              The exception that is thrown when an application attempts to perform a networking operation on its main thread.



              :)
              • Partager sur Facebook
              • Partager sur Twitter
              Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
                18 juin 2012 à 20:55:14

                Avancement, j'ai mis la connexion dans un thread, mais maintenant j'ai une erreur de class.

                L'erreur est la suivante:
                Could not find class 'javax.naming.StringRefAddr', referenced from method com.mysql.jdbc.ConnectionProperties$ConnectionProperty.storeTo

                Après quelques recherches sur la toile, mes recherches n'ont pas été fructueuses.

                Besoin d'aide :euh:
                • Partager sur Facebook
                • Partager sur Twitter
                  18 juin 2012 à 21:34:36

                  C'est court comme information, il faudrait le reste de l'erreur et le code associé à l'erreur. :)
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
                    18 juin 2012 à 21:38:24

                    Mille pardons, voici le code entier


                    package net.sgn.beta;
                    
                    import android.app.Activity;
                    import android.media.MediaPlayer;
                    import android.os.Bundle;
                    import android.os.Handler;
                    import android.content.Intent;
                    
                    import android.view.animation.Animation;
                    import android.view.animation.Animation.AnimationListener;
                    import android.view.animation.AnimationUtils;
                    import android.widget.FrameLayout;
                    import android.widget.ImageView;
                    import android.widget.TextView;
                    import android.widget.Toast;
                    import android.util.Log;
                    
                    import java.sql.Connection;
                    import java.sql.DriverManager;
                    import java.sql.SQLException;
                    
                    
                    //import net.sgn.official.clsMySQL;
                    
                    public class SGNSplash  extends Activity
                    {
                    	
                    	ImageView imgLOGO = null;
                    	FrameLayout frmMain = null;
                    	Animation imgAnim = null; 
                    	
                    	Connection conn = null;
                    		
                    	@Override
                    	public void onCreate(Bundle savedInstanceState) {
                            super.onCreate(savedInstanceState);
                            
                            setContentView(R.layout.load);
                            
                                    
                            //Thread de connection BDD
                            Thread Connect = new Thread(){
                            	@Override
                            	public void run() {
                            		
                            		try
                                    {
                                    	
                                    	try {
                            				Class.forName("com.mysql.jdbc.Driver").newInstance();
                            		
                            			} catch (InstantiationException e) {
                            				// TODO Auto-generated catch block
                            				e.printStackTrace();
                            				Log.e("Instanciation Driver", e.getMessage());
                            			} catch (IllegalAccessException e) {
                            				// TODO Auto-generated catch block
                            				e.printStackTrace();
                            				Log.e("Access Exception", e.getMessage());
                            			} catch (ClassNotFoundException e) {
                            				// TODO Auto-generated catch block
                            				e.printStackTrace();
                            				Log.e("Class", e.getMessage());
                            			}
                            			       	
                                    	
                                    	String url = "jdbc:mysql://monserveur/mabase?autoReconnect=true";
                            			String user = "root";
                            			String passwd = "mdp";
                            			
                            			
                            			conn = DriverManager.getConnection(url, user, passwd);
                            	     		Log.i("Connection", "Etablished");
                                    	
                                    }
                                    catch(SQLException e)
                                    {
                                    	e.printStackTrace();
                                                        
                                        Log.e("MySQL", e.getMessage());
                                    }
                    
                            	}
                    
                            	};
                            
                            Connect.start();
                               
                                  
                            imgAnim = AnimationUtils.loadAnimation(this, R.anim.animation);
                            
                            
                            imgLOGO = (ImageView)findViewById(R.id.imgLogo);
                            
                           	imgLOGO.startAnimation(imgAnim);
                           	imgAnim.setAnimationListener(afficheLoad);
                           	
                           	MediaPlayer plsd = MediaPlayer.create(this, R.raw.kawoosh);
                           	plsd.start();
                         
                    	};
                    	
                    	
                    	private AnimationListener afficheLoad = new AnimationListener()
                    	{
                    
                    		public void onAnimationEnd(Animation animation) {
                    			// TODO Auto-generated method stub
                    			Intent intent = new Intent(SGNSplash.this, SGNActivity.class);
                        		startActivity(intent);
                        		try {
                    				this.finalize();
                    			} catch (Throwable e) {
                    				// TODO Auto-generated catch block
                    				e.printStackTrace();
                    			}
                    
                    		}
                    
                    		public void onAnimationRepeat(Animation animation) {
                    			// TODO Auto-generated method stub
                    			
                    		}
                    
                    		public void onAnimationStart(Animation animation) {
                    			// TODO Auto-generated method stub
                    			
                    			TextView title = (TextView)findViewById(R.id.off_lunch);
                    			title.startAnimation(imgAnim);
                    			
                    		}
                    		
                    	};
                    	
                    	
                    	private void Message(String pMessage)
                    	{
                    		Toast.makeText(this, pMessage, Toast.LENGTH_SHORT).show();
                    	};
                    	
                    	
                    }
                    

                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 juin 2012 à 21:50:36

                      Tu devrais te rendre sur cette page du Dev Guide de la documentation Google pour exécuter du code dans un thread secondaire (je te conseil AsyncTask).
                      Ceci étant, faudrait toute l'erreur aussi pour situer directement l'erreur.
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
                        18 juin 2012 à 23:03:09

                        Super, ça fonctionne, la connexion est bien établie.

                        J'ai créé un class clsConn:

                        import android.os.AsyncTask;
                        import android.util.Log;
                        import android.widget.Toast;
                        import android.content.Context;
                        
                        import java.sql.Connection;
                        import java.sql.DriverManager;
                        import java.sql.SQLException;
                        
                        public class clsConn extends AsyncTask{
                        
                        	private String Host = null;
                        	private String DBB = null;
                        	private String User = null;
                        	private String Pass = null;
                        	
                        	private Connection Conn = null;
                        	
                        	clsConn(String pHost, String pDBB, String pUser, String pPass)
                        	{
                        		Host = pHost;
                        		DBB= pDBB;
                        		User = pUser;
                        		Pass = pPass;
                        	}
                        	
                        
                        	@Override
                        	protected Object doInBackground(Object... params) {
                        		// TODO Auto-generated method stub
                        		
                        		
                        		try
                                {
                                	
                                	try {
                        				Class.forName("com.mysql.jdbc.Driver").newInstance();
                        				Log.i("Driver", "Driver initialised");
                        			} catch (InstantiationException e) {
                        				// TODO Auto-generated catch block
                        				e.printStackTrace();
                        				Log.e("Instanciation Driver", e.getMessage());
                        			} catch (IllegalAccessException e) {
                        				// TODO Auto-generated catch block
                        				e.printStackTrace();
                        				Log.e("Access Exception", e.getMessage());
                        			} catch (ClassNotFoundException e) {
                        				// TODO Auto-generated catch block
                        				e.printStackTrace();
                        				Log.e("Class", e.getMessage());
                        			}
                        			       	
                                	
                                	String url = "jdbc:mysql://"+Host+"/"+DBB+"?autoReconnect=true";
                        			String user = User;
                        			String passwd = Pass;
                        			
                        			Conn = DriverManager.getConnection(url, user, passwd);
                        			Log.i("Connection", "Etablished");
                                	
                                }
                                catch(SQLException e)
                                {
                                	e.printStackTrace();
                                	Log.e("MySQL", e.getMessage());
                                };
                        		
                        		
                        		return Conn;
                        	};
                        }
                        



                        La question que je me pose maintenant est : comment récupéré la connexion de cette AsyncTask ?

                        Mon code dans mon appli est le suivant :

                        Connection Conn = null;
                        
                        clsConn classConn = new clsConn("mysql.stargate-network.net", "sgnetwork_soon", "root", "af4a332c");
                                classConn.execute(null);
                                try {
                        			Conn = (Connection) classConn.get();
                        			Toast.makeText(this, "Connected", Toast.LENGTH_LONG);
                        		} catch (InterruptedException e) {
                        			// TODO Auto-generated catch block
                        			e.printStackTrace();
                        		} catch (ExecutionException e) {
                        			// TODO Auto-generated catch block
                        			e.printStackTrace();
                        		}
                        



                        Mais malheureusement, je n'arrive pas à récupéré la connexion.
                        Une idée ? :euh:
                        • Partager sur Facebook
                        • Partager sur Twitter
                          19 juin 2012 à 9:47:59

                          Bonjour,

                          Le mieux pour utiliser une AsyncTask est de créer une inner class car cette dernière à accès aux méthodes de la classe extérieure.
                          • Partager sur Facebook
                          • Partager sur Twitter

                          [Android] MySQL et JDBC

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown