尝试使用JDBC

时间:2015-04-30 10:41:27

标签: android mysql jdbc connection

我在Android中编写了一个简单的应用程序,它包含一个按钮,当单击该按钮时,尝试使用JDBC连接到MySQL数据库。 现在,我尝试输入互联网上数据库的URL和凭据,然后我就能连接到它。

当我尝试连接到我安装在我的PC上的MySQL数据库时,它会抛出一个关于(我认为)JDBC字符串的SQLException。 我以这种方式使用root凭据进行访问:

JDBC:MySQL的://本地主机:3306 / DB_NAME

我还尝试在Java应用程序中运行连接,它运行良好......它在Android中存在某种问题。 我的申请代码是:

       package com.example.testconnessionemysql;

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






       import android.app.Activity;
       import android.app.ProgressDialog;
       import android.os.AsyncTask;
       import android.os.Bundle;
       import android.view.Menu;
       import android.view.MenuItem;
       import android.view.View;
       import android.view.View.OnClickListener;
       import android.widget.Button;
       import android.widget.Toast;

        public class MainActivity extends Activity implements               OnClickListener{
         Button bottone;
         @Override
         protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         bottone = (Button)findViewById(R.id.button1);
         bottone.setOnClickListener(this);





}




          class ConnectAsync extends AsyncTask<String, Void, String> {

          @Override
          protected String doInBackground(String... urls) {

          String url = "jdbc:mysql://localhost:3306/prova";
          String user = "root";
          String password = "my_psw";


          Connection connection = null;
          try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(url,user,password);
           } catch (ClassNotFoundException e) {
            System.out.println("Driver non caricato");
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("Errore con url e credenziali!");

        }

        if(connection!= null)
        {System.out.println("Connessione riuscita!");}
        return null;}

         }



        public void connectToDB(View view)
        {
         ConnectAsync task = new ConnectAsync();
       task.execute();







               }



              @Override
              public void onClick(View v) {
               connectToDB(v);

             }



                }

我也把logcat放在这里:

04-30 06:25:17.670: W/EGL_emulation(1965): eglSurfaceAttrib not     implemented
04-30 06:25:22.150: W/System.err(1965): com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
04-30 06:25:22.150: W/System.err(1965): The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
04-30 06:25:22.150: W/System.err(1965):     at java.lang.reflect.Constructor.constructNative(Native Method)
04-30 06:25:22.150: W/System.err(1965):     at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
04-30 06:25:22.150: W/System.err(1965):     at com.mysql.jdbc.Util.handleNewInstance(Util.java:389)
04-30 06:25:22.150: W/System.err(1965):     at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1038)
04-30 06:25:22.150: W/System.err(1965):     at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:338)
04-30 06:25:22.150: W/System.err(1965):     at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2237)
04-30 06:25:22.150: W/System.err(1965):     at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2270)
04-30 06:25:22.150: W/System.err(1965):     at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2069)
04-30 06:25:22.150: W/System.err(1965):     at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:794)
04-30 06:25:22.150: W/System.err(1965):     at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:44)
04-30 06:25:22.150: W/System.err(1965):     at java.lang.reflect.Constructor.constructNative(Native Method)
04-30 06:25:22.150: W/System.err(1965):     at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
04-30 06:25:22.150: W/System.err(1965):     at com.mysql.jdbc.Util.handleNewInstance(Util.java:389)
04-30 06:25:22.150: W/System.err(1965):     at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:399)
04-30 06:25:22.150: W/System.err(1965):     at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:325)
04-30 06:25:22.150: W/System.err(1965):     at java.sql.DriverManager.getConnection(DriverManager.java:179)
04-30 06:25:22.150: W/System.err(1965):     at java.sql.DriverManager.getConnection(DriverManager.java:213)
04-30 06:25:22.150: W/System.err(1965):     at com.example.testconnessionemysql.MainActivity$ConnectAsync.doInBackground(MainActivity.java:55)
04-30 06:25:22.150: W/System.err(1965):     at com.example.testconnessionemysql.MainActivity$ConnectAsync.doInBackground(MainActivity.java:1)
04-30 06:25:22.150: W/System.err(1965):     at android.os.AsyncTask$2.call(AsyncTask.java:288)
04-30 06:25:22.150: W/System.err(1965):     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
04-30 06:25:22.150: W/System.err(1965):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
04-30 06:25:22.150: W/System.err(1965):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
04-30 06:25:22.150: W/System.err(1965):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
04-30 06:25:22.150: W/System.err(1965):     at java.lang.Thread.run(Thread.java:841)
04-30 06:25:22.150: W/System.err(1965): Caused by: java.net.SocketException: socket failed: EACCES (Permission denied)
04-30 06:25:22.150: W/System.err(1965):     at libcore.io.IoBridge.socket(IoBridge.java:576)
04-30 06:25:22.150: W/System.err(1965):     at java.net.PlainSocketImpl.create(PlainSocketImpl.java:201)
04-30 06:25:22.150: W/System.err(1965):     at java.net.Socket.checkOpenAndCreate(Socket.java:664)
04-30 06:25:22.150: W/System.err(1965):     at java.net.Socket.setTcpNoDelay(Socket.java:530)
04-30 06:25:22.150: W/System.err(1965):     at com.mysql.jdbc.StandardSocketFactory.configureSocket(StandardSocketFactory.java:134)
04-30 06:25:22.150: W/System.err(1965):     at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:205)
04-30 06:25:22.150: W/System.err(1965):     at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:297)
04-30 06:25:22.150: W/System.err(1965):     ... 20 more
04-30 06:25:22.150: W/System.err(1965): Caused by: libcore.io.ErrnoException: socket failed: EACCES (Permission denied)
04-30 06:25:22.150: W/System.err(1965):     at libcore.io.Posix.socket(Native Method)
04-30 06:25:22.150: W/System.err(1965):     at libcore.io.BlockGuardOs.socket(BlockGuardOs.java:181)
04-30 06:25:22.150: W/System.err(1965):     at libcore.io.IoBridge.socket(IoBridge.java:561)
04-30 06:25:22.150: W/System.err(1965):     ... 26 more
04-30 06:25:22.150: I/System.out(1965): Errore con url e credenziali!

从logcat中可以看出,它捕获了一个SQLException并打印出我在代码中写的消息,所以我认为数据库连接存在问题。 我使用MYSQL Workbench来处理这个数据库,我还授予root用户从每个IP地址访问的权限,我也用这种方式编辑了my.ini MySQL配置文件:

[mysqld]
...

bind-address    = *
#skip-networking
...

我使用MySQL Server 5.6,并使用mysql-connector-java-5.1.35-bin.jar作为JDBC驱动程序。 正如我之前所说,我能够使用相同的代码连接到互联网上的另一个MySQL数据库,没有错误...我只是找不到我的数据库发生了什么。

我知道Android中的JDBC数据库连接并不是最好的解决方案,但我希望在转向更有效的方式(如JSON和Web服务)之前练习这种方式。 提前谢谢!

2 个答案:

答案 0 :(得分:0)

这是因为android手机中没有mysql数据库。当你制作一个简单的Java Project(不是android项目)并且你在笔记本电脑上安装了mysql并且你在mysql中存储数据时,通过jdbc与mysql建立连接数据库。 这里发生的是当你运行你的应用程序时,应用程序进入移动设备,而mysql是在笔记本电脑中,android手机中没有mysql。换句话说,没有办法安卓手机可以将数据存储在笔记本电脑的数据库中。 如果你想在Android手机中存储数据,你可以使用SQLite,它是android手机中的本地数据库...你的应用程序将数据存储在Sqlite中,并在需要时检索它。

这是一个关于android数据库连接的好教程--- http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/

答案 1 :(得分:0)

你不一定要使用&#34; / localhost:3306&#34;。相反,您必须使用本地计算机的IP地址(NO 127.0.0.1)