Android应用用JDBC连接本地MySQL报java.lang.UnsupportedOperationException
Android中使用JDBC连接MySQL抛出UnsupportedOperationException的解决方法
问题根源分析
- 主线程禁止网络操作:Android严格禁止在UI主线程执行网络IO(包括JDBC数据库连接),这是触发
UnsupportedOperationException的核心原因。 - 驱动类名错误:MySQL 8.0版本的JDBC驱动类应为
com.mysql.cj.jdbc.Driver,而非旧版的com.mysql.jdbc.Driver。 - 连接地址无效:Android设备上的
localhost指向设备自身,无法访问你电脑上的MySQL服务,需替换为电脑的局域网IP(如192.168.1.100)。 - ResultSet处理错误:直接调用
rs.toString()无法获取查询结果,需遍历ResultSet提取数据。
修复后的代码示例
使用AsyncTask将数据库操作移至后台线程:
public class MainActivity extends AppCompatActivity { TextView query_result_TextView, Error_textview; Button show_btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); query_result_TextView = findViewById(R.id.textView); Error_textview = findViewById(R.id.textView2); show_btn = findViewById(R.id.showbtn); show_btn.setOnClickListener(view -> new DBQueryTask().execute()); } private class DBQueryTask extends AsyncTask<Void, Void, String> { private Exception exception; @Override protected String doInBackground(Void... voids) { StringBuilder result = new StringBuilder(); try { // 加载MySQL 8.0驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 替换为你的电脑局域网IP,确保MySQL允许远程连接 Connection con = DriverManager.getConnection( "jdbc:mysql://192.168.1.100:3306/adl?useSSL=false&serverTimezone=UTC", "testuser", "12345678" ); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM test"); // 遍历ResultSet获取数据 while (rs.next()) { // 根据你的表结构调整字段名,比如id、name等 result.append("ID: ").append(rs.getInt("id")) .append(" | 内容: ").append(rs.getString("content")) .append("\n"); } rs.close(); stmt.close(); con.close(); } catch (Exception ex) { this.exception = ex; return null; } return result.toString(); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); if (exception != null) { Error_textview.setText(exception.toString()); } else { query_result_TextView.setText(s.isEmpty() ? "无数据" : s); } } } }
额外注意事项
- MySQL远程连接权限:确保你的MySQL用户
testuser拥有远程连接权限,可执行SQL:GRANT ALL ON adl.* TO 'testuser'@'%' IDENTIFIED BY '12345678'; FLUSH PRIVILEGES; - 网络环境:Android设备需和你的电脑处于同一局域网,或MySQL服务暴露公网(不推荐,存在安全风险)。
- 性能与安全:JDBC直接连接数据库在Android中并非最佳实践,生产环境建议通过后端API中转数据库操作,避免暴露数据库账号密码和直接连接风险。
内容的提问来源于stack exchange,提问作者Captain_zed
相关产品推荐
相关产品推荐

