尝试使用 JDBC 将 Android 连接到 MySQL 数据库时出错

问题描述 投票:0回答:3

我在 Android 中编写了一个简单的应用程序,其中包含一个按钮,当单击该按钮时,它会尝试使用 JDBC 连接到 MySQL 数据库。 现在,我尝试输入位于 Internet 上的数据库的 URL 和凭据,并且能够连接到它。

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

jdbc:mysql://localhost: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 服务)之前练习这种方式。 提前致谢!

android mysql jdbc connection
3个回答
0
投票

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

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


0
投票

您不必使用“/localhost:3306”。相反,您必须使用本地计算机的 IP 地址(NO 127.0.0.1)


0
投票

您不能使用本地主机,因为 Android 应用程序无法连接到您计算机上的数据库服务器。

如果你在本地使用,你可以通过多种方式来做到这一点,你可以通过观看 YouTube 上的一些教程来设置 wamp 服务器以在连接的移动设备中使用它。

如果您仍然无法使用互联网上提供的免费 MySQL 服务器进行学习或测试。

© www.soinside.com 2019 - 2024. All rights reserved.