使用 mysql-connector-java.5.1.26-bin.jar 将我的 android 应用程序连接到远程 mysql 主机。问题是,任何高于minSdkVersion 9的内容都会导致"通信链路故障"。如果我将其设置为 9,它连接良好并获取数据库信息。这是我的连接代码:
try {
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection(url, user, pass);
Statement st = con.createStatement();
ResultSet rs = st.executeQuery("select * from users");
ResultSetMetaData rsmd = rs.getMetaData();
while(rs.next()) {
....
}
}
catch(Exception e) {
e.printStackTrace();
}
关于为什么会发生这种情况的任何想法?
事实证明,问题是我试图在主活动中建立网络连接。对于那些可能有相同问题的人,请考虑使用 asynctask 来完成连接。
http://developer.android.com/reference/android/os/AsyncTask.html
这是我的开发环境:
- 操作系统: 乌班图14.04
- IDE: Eclipse Luna
- 数据库: MySQL5.1.73
首先,我将下面的代码放在OnCreate方法中:
Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection conn = DriverManager.getConnection(url, username,
password);
Statement stmt = conn.createStatement();
String sql = "select distinct Action from attributes";
ResultSet rs = stmt.executeQuery(sql);
连接代码正常,但会出现:
通信链路故障。成功发送到服务器的最后一个数据包是 0 毫秒前。驱动程序未从服务器收到任何数据包。
所以它一定是错的。尝试各种方法后,并使用android AsyncTask解决它。只需将与操作mysql相关的代码放在扩展AsyncTask的类中即可。下面是我的代码:
private class Connect extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... urls) {
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection conn = DriverManager.getConnection(url, username,
password);
Statement stmt = conn.createStatement();
String sql = "select distinct Action from attributes";
ResultSet rs = stmt.executeQuery(sql);
List<String> actions = new ArrayList<String>();
while (rs.next()) {
actions.add(rs.getString("Action"));
}
} catch (Exception e) {
Log.d("MySQLConnection", e.getMessage());
}
return null;
}
}