You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 05:15:20