① 连接数据库的时候不能使用localhost,必须使用当前IP地址

String URL="jdbc:mysql://192.168.1.108:3306/db1?serverTimezone = GMT&characterEncoding=UTF-8";

IP地址可通过WIN键+R,输入CMD,在黑框中输入ipconfig指令获得IPV4地址

② 用IP地址连接的时候需要注意,通过IP地址连接MySql数据库需要处理两点,Android加入访问权限和MYSQL允许用户远程访问

一、在AndroidManifest.xml中加入相关的权限

  <uses-permission android:name="android.permission.INTERNET" />

二、mysql数据库需要能允许远程用户访问

允许root使用rootpassword从任何主机连接到MySQL服务器,root为用户名,rootpassword为用户密码

Mysql数据库开启远程连接 - 赵广陆 - 博客园

GRANT ALL PRIVILEGES ON *.* TO root@'%' IDENTIFIED BY 'rootpassword' WITH GRANT OPTION;

FLUSH PRIVILEGES;

可以通过navicat测试连接,如果成功,则代表能够远程访问。 

 ③ Mysql Jar包问题导致

如果上述两种都没问题,关闭防火墙之后,依然不能正常连接,就需要注意MySQL的jar包问题。

我的问题解决方式就是更换JAR包版本来解决的,建议把JAR包换成5.1.49版本就能正常连接数据库。

mysql-connector-java-5.1.49 百度网盘下载地址分享_嘉 诚的博客-CSDN博客_mysql-connector-java-5.1.48

我的MYSQL是8.0版本,如果用同样是8.0版本的jar包,就会报错:java.lang.NoClassDefFoundError Failed resolution of LjavasqlSQLType

④ 必须新开一个线程处理MySQL的连接过程,给出整体的能运行的代码

注意,连接MySQL数据库,需要新开一个线程运行,不然也会出错。

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 连接数据库
        initLogin();
    }


    private void initLogin() {
        // 必须新开线程才能连接MySQL数据库
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 数据库驱动
                String CLS="com.mysql.jdbc.Driver";
                //这里的ip地址要改为自己的,db1为自己的数据库名字
                String URL="jdbc:mysql://192.168.1.108:3306/db1?serverTimezone = GMT&characterEncoding=UTF-8";
                String USER="root";
                //这里输入自己的数据库密码
                String PWD="";
                // 用test做一个简单的测试
                String test="";
                try {
                    // 加载数据库驱动
                    Class.forName(CLS).newInstance();
                    // 连接数据库
                    Connection conn=(Connection) DriverManager.getConnection(URL,USER,PWD);
                    // sql 语句:从video表中获取全部数据
                    String sql="select * from video";
                    Statement stmt=conn.createStatement();
                    // 执行sql
                    ResultSet rs=stmt.executeQuery(sql);
                    // 循环读取
                    while (rs.next()){
                        // 读取videoTitle字段,记载在test中
                        test+=rs.getString("VideoTitle");
                        // 打印test
                        Log.v("debug",test);
                    }
                } catch (ClassNotFoundException | SQLException | IllegalAccessException | InstantiationException e) {
                    e.printStackTrace();
                }
            }
        }).start();

    }

}

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐