我知道,这个主题会有重复,但我找到的解决方案就像2岁,而且不适合我,所以这就是我要求更新主题的原因。
问题很简单:如何将我的Android设备连接到MySQL数据库?
我从2013年2月开始关注这个老话题(ofc与其他相关主题的比较,实际上几乎相同)。 https://stackoverflow.com/a/14982316/4256313
我从解决方案中找到了库,mysql-connector-java-3.0.17-ga-bin.jar
在没有成功之后,我也尝试了这个库的新版本,mysql-connector-java-5.1.23-bin.jar
根据此视频指南,这两个库都已添加到项目中: https://www.youtube.com/watch?v=dpuJPoXkFG4
现在我的个人解决方案: 我在主活动中有4个字段,包括主机,端口,名称和密码。
主要活动看起来像这样(这里没什么特别的):
TextView txtHost;
TextView txtPort;
TextView txtLoginName;
TextView txtPassword;
Button login;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txtHost = (TextView) findViewById(R.id.txtHost);
txtPort = (TextView) findViewById(R.id.txtPort);
txtLoginName = (TextView) findViewById(R.id.txtLoginName);
txtPassword = (TextView) findViewById(R.id.txtPassword);
login = (Button) findViewById(R.id.btnLogin);
}
//this is function bind to Login Button.
// I need to do a connection in static class to preserve it for another activities
public void klik(View view){
ConnCore.ConnCoreStatic.servername = txtHost.getText().toString();
ConnCore.ConnCoreStatic.port = txtPort.getText().toString();
ConnCore.ConnCoreStatic.name = txtLoginName.getText().toString();
ConnCore.ConnCoreStatic.pass = txtPassword.getText().toString();
if(ConnCore.ConnCoreStatic.DBConn(MainActivity.this)==true){
Intent inent = new Intent(this, TableRows.class);
startActivity(inent);
}
}
这是处理连接的静态方法:
public class ConnCore {
public static class ConnCoreStatic{
static String servername;
static String port;
static String name;
static String pass;
static Connection mysqlConn;
static List<String> DBResponse;
static boolean DBConn(Context c){
try{
Class.forName("com.mysql.jdbc.Driver").newInstance();
}
catch(Exception e){
AlertDialog alertDialog = new AlertDialog.Builder(c).create();
alertDialog.setTitle("Error");
alertDialog.setMessage("Could not initialize driver");
alertDialog.show();
return false;
}
try{ //Toast just for me, checking if data for conn function is correct
Toast.makeText(c, "jdbc:mysql://"+servername+":"+port+name+pass,
Toast.LENGTH_LONG).show();
mysqlConn = DriverManager.getConnection(servername+":"+port,name,pass);
return true;
}
catch(Exception e){
AlertDialog alertDialog = new AlertDialog.Builder(c).create();
alertDialog.setTitle("Error");
alertDialog.setMessage("Could not login to database");
alertDialog.show();
return false;
}
}
}
}
我还为android manifest添加了INTERNET权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
我还包括(希望)我的静态类中所有需要的库。
import java.sql.*;
实际上我的问题在哪里? Android没有连接。这部分总是以catch块结束。而且我很确定,我有正确的连接访问权限,出于测试目的,我使用db我经常从我的PC连接。
try{
mysqlConn = DriverManager.getConnection(servername+":"+port,name,pass);
return true;
}
catch(Exception e){
AlertDialog alertDialog = new AlertDialog.Builder(c).create();
alertDialog.setTitle("Error");
alertDialog.setMessage("Could not login to database");
alertDialog.show();
return false;
}
作为地址,我尝试过我认为我在这个问题的例子中找到的所有组合:
jdbc:mysql://XXX.XXX.XXX.XXX:YYYY
jdbc:mysql://XXX.XXX.XXX.XXX:YYYY/database_name (dont want that, just trying)
XXX.XXX.XXX.XXX:YYYY
XXX.XXX.XXX.XXX:YYYY/database_name (dont want that, just trying)
另外,为了消除UI元素中某些字符串转换的错误,我在代码中写下了连接数据。
仍然无法正常工作。仍无法访问。 也没有连接到PC(手机通过USB从PC上网),也没有连接电脑,直接在wifi上运行或直接在移动数据上运行。
我不知道,如果这只是我的感觉,但即使在PC上,也需要0.5秒到2秒才能连接。在这里,似乎警报对话框几乎立即显示,就像它甚至没有尝试连接一样。
这里有什么问题? 拜托,你能帮忙吗?
提前告诉你。
//基于评论的编辑: 尝试/捕获块抛出
"java.sqlException: No suitable Driver"
//从一个错误到另一个错误 我成功添加了一个驱动程序。 3.0.17已过时,需要使用mysql-connector-java-5.1.23-bin.jar 在Adress中,必须有“jdbc:mysql://”前缀
现在有这个错误:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 通信链路故障
成功发送到服务器的最后一个数据包是0毫秒 前。驱动程序没有从服务器中收集任何数据包
仍然有正确的连接数据,仍然看起来像Android甚至没有尝试连接。在wifi,电话数据,共享计算机互联网访问,甚至与互联网断开连接时出现相同的错误。
//更多挖掘后: 我找到了一种不同的方法,如何将连接数据传递给JDBC: ?JDBC:MySQL的://XXX.XXX.XXX.XXX:YYYY用户=根&安培;密码=试验&安培; autoReconnect的=真安培; failOverReadOnly =假安培; maxReconnects为= 10
嗯,现在,它说,它试图连接到这个IP 10次,现在有错误:
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: 无法创建与数据库服务器的连接。尝试重新连接10 倍。放弃。
“Android监视器”中的Android工作室也说:
I / System.out:[CDS] connect [/XX.XX.XXX.XX:3306] tm:90
但是我检查了我的MySQL服务器上的日志,并没有任何阻止连接。
任何适合Android?