我在Android中编写了一个简单的应用程序,它包含一个按钮,当单击该按钮时,尝试使用JDBC连接到MySQL数据库。 现在,我尝试输入互联网上数据库的URL和凭据,然后我就能连接到它。
当我尝试连接到我安装在我的PC上的MySQL数据库时,它会抛出一个关于(我认为)JDBC字符串的SQLException。 我以这种方式使用root凭据进行访问:
我还尝试在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服务)之前练习这种方式。 提前谢谢!
答案 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)