今天花了这么长时间但是没写几行代码,主要是在找错误。

我学习在android项目中远程连接数据库的过程中出现了非常多的问题,在网络上众多没用的帖子中寻找有用的信息耗费了我大量时间。现在我把我遇到的错误写出来希望能对后来者有帮助。

我连接的是mysql数据库。数据库版本是 8.0.36。使用的驱动 mysql-connection的jar包的版本是5.1.7。android studio的版本是   Iguana | 2023.2.1 。使用的数据库可视化工具是navicat 版本是16。

首先我们肯定要安装好mysql和android studio,mysql的安装请参考MySQL的安装及环境变量的配置

android studio的安装我就不多说了,在csdn上有非常多的教程,一般也不会出什么问题。

除此之外,你最好安装navicat,这个软件可以使我们的数据库的操作变得方便,本文后续操作也会用到这个软件。具体安装过程请csdn。

第一步我们启动mysql

在键盘上同时按win+r

在出现的窗口的输入框中输入services.msc,点击确定

找到自己的mysql服务看看它是否在运行,如果没有运行就右击它,然后点击“启动”选项

第二步我们打开android studio新建项目

点击new project

选择empty views activity  后点击next     注意!!!如果你是新版本的android studio就要选择empty views activity,低版本的选择empty activity,这是高低版本的不同之处。

然后修改你的项目名称和包名称,也可以不修改使用默认的。这里我使用的默认的。language一栏选择Java,SDK选择API 28,也就是安卓9的版本。点击finish,这样新项目就创建好了。 

第三步我们进行一些配置

第一件事,我们找到红框的位置,把视图改为project

在app/src/main 中找到AndroidManifest.xml文件,双击打开

在文件中添加一句话。注意这句话的位置,与<application  平级即可。写在<application 的上面或</application>的下面都可以。

这句话用于获取访问互联网的权限。

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

然后我们导入mysql-connection的jar包,用于jdbc连接数据库。

首先我们下载jar包,下载地址https://downloads.mysql.com/archives/c-j/  建议选择5.X版本的驱动包,高版本的可能会出现问题。如果你勇于尝试的话也可以试试高版本的驱动。

打开下载下来的压缩文件,左击mysql-connector-java-5.1.7-bin.jar文件 然后键盘上按ctrl+c复制,或者直接右击mysql-connector-java-5.1.7-bin.jar选择复制到剪切板

打开android studio,右击app文件夹,新建一个文件夹命名为libs(如果有就不用新建了)

建好以后把刚才复制的mysql-connector-java-5.1.7-bin.jar复制进libs文件夹。可以左击libs文件夹然后ctrl+v或者右击然后选择Paste

点击ok

现在libs目录下已经有mysql-connector-java-5.1.7-bin.jar了,我们右击它,然后选择Add As Library

点击ok

等待右下角进度条跑完我们就成功导入数据库连接驱动包了。

 

第四步我们对MySQL进行一些操作

你的mysql应该是已经配置好环境变量能够正常使用的。

在键盘上按win+r,输入cmd,打开命令窗口,输入mysql -u root -p命令,输入密码

然后输入命令use mysql;,mysql这个数据库中存储了用户信息的user表

接着执行命令select User,Host,plugin from user;显示了一个表格。这里因为我已经配置好了,所以在表的最上面有一个host为“%”user为“android”的项,如果你没有配置过,你没有是正常的 。我们观察user为root的这一项,这就是你配置数据库时的账号,应该大部分人都是用的默认的,为root,它的host为localhost,意为这个账号只能用于ip为localhost的用户访问数据库(也就是只能在本机使用,ip为其他的话就无法通过这个账号访问数据库了),但是我们的android肯定和我们的电脑属于两台不同的设备,所以安卓设备无法通过localhost这个ip向电脑发送请求,要通过电脑的ip地址向电脑发送请求,所以android无法通过root这个账号来访问电脑上的数据库。所以我们的解决办法有两种。第一种就是把root这个账号的host改了,让他允许通过远程的方式来访问数据库。第二种我们新建一个好用的账号,通过这个账号能够远程访问。

这里我们采取第二种解决办法

1.我们先创建一个新用户

我们继续在cmd中输入命令create user 'username'@'%' identified by 'password';把命令中的“username”和“password”替换成你喜欢的,不要包含中文。“username”建议不要替换成“root”,password建议直接用root账号的密码,这样方便记忆。

2.然后给创建好的账号赋予远程权限

输入命令grant all privileges on *.* to 'username'@'%' with grant option;这里的username就是上一步你输入的

3.刷新数据库

输入命令FLUSH PRIVILEGES;

4.查看数据库中的用户权限表

输入命令select User,Host,plugin from user;这时你就能看到你的表格的最上面也像我一样,比之前多了一行

5.修改加密规则

输入命令ALTER USER 'username'@'%' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;username和password就是你第2步时输入的

接着输入ALTER USER 'username'@'%' IDENTIFIED WITH mysql_native_password BY 'password';同样把单引号内的username和password改成你之前输入的

 

这里第5步操作的原因是 mysql8 之前的版本中   密码的加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password,如果我们用的数据库驱动包的版本较低,它可能不能使用 caching_sha2_password加密,从而导致连接失败

6.刷新数据库

输入命令FLUSH PRIVILEGES;

 

现在我们对数据库的操作已经完成了。

 

我们用navicat试试连接数据库

点击连接,选择mysql

连接名随便取一个,因为后面我们还要测试远程连接,为了区分我取名为local,主机、端口不变,用户名就是有本地连接权限的root,密码就是你的密码,点击确定

双击local,出现具体的数据库,本地连接成功!!

我们再次点击连接,选择mysql,这次我们把连接名写成remote,主机改为自己的IP地址,用户名和密码写刚才创建新用户时填写的用户名和密码,点击确定,双击remote,出现具体的数据库,远程连接也成功了!!

查看ip的方法是打开cmd,输入ipconfig/all,其中的ipv4便是本机IP地址

 

然后我们在local下面空白的部分右击鼠标,点击新建数据库,取一个自己喜欢的数据库名,字符集和排序规则空白就好了,点击确定

例如我这里新建的数据库study。右击study下面的表,选择新建表

名一栏可以随便去一个你喜欢的,比如id,类型选择int,点击保存

表名我们就取为test,点击保存

这样我们的表就建好了

我们点击最下面的加号

在id栏输入一个数字后点击加号一旁的对勾,这样就添加了一个数据,然后我们再添加两个数据,可以添加任意数字,这样我们就有三条数据了

我们还可以通过sql语句创建数据库和表,同时添加数据。这部分内容不是我们的重点,请自行学习。

 

这样我们所有的操作就都完成了,接下来我们就可以开始写代码啦!!

首先给大家展示一下我的目录结构

在com.example.myapplication下新建一个java类MySqlHelp,这是直接连接数据库的辅助工具类

代码如下
 
注意MySqlHelp.java中的注释,要把部分名称替换为你自己的
 
 
//MySqlHelp.java


package com.example.myapplication;

import android.os.Bundle;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;


/**
 *直接连接数据库的辅助工具类
 */

public class MySqlHelp {
    public static int getUserSize(){
        final String CLS="com.mysql.jdbc.Driver";
        
        //将URL中的“*.*.*.*”替换成自己的ip地址,“study”替换为你自己的数据库的名字
        final String URL="jdbc:mysql://*.*.*.*:3306/study?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf8";
        final String USER="android";
        final String PASSWORD="123456";

        int count = 0;

        try{
            Class.forName(CLS);
            Connection connection = DriverManager.getConnection(URL,USER,PASSWORD);
            
            //将“id”替换为你自己数据库中的表的名字
            String sql="select count(1) as s1 from id";
            
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery(sql);
            while(resultSet.next()){
                count = resultSet.getInt("s1");
            }
        }catch (Exception e){
            e.printStackTrace();
        }

        return count;
    }

}
//MainActivity.java


package com.example.myapplication;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import androidx.activity.EdgeToEdge;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private Button btn_queryCount;
    private TextView tv_userCount;

    private Handler handler = new Handler(){
        @Override
        public void handleMessage(@NonNull Message msg) {
            if(msg.what == 0){
                int count = (Integer)msg.obj;
                tv_userCount.setText("数据库中的用户数量为:"+count);
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
    }

    private void initView(){
        btn_queryCount = findViewById(R.id.btn_queryCount);
        tv_userCount = findViewById(R.id.tv_userCount);

        btn_queryCount.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.btn_queryCount) {
            doQueryCount();
        }
    }

    //执行查询用户数量的方法
    private void doQueryCount(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                int count = MySqlHelp.getUserSize();
                Message msg = Message.obtain();
                msg.what = 0;
                msg.obj = count;
                //向主线程发送数据
                handler.sendMessage(msg);

            }
        }).start();
    }
}

 

前端页面的代码

//activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:layout_margin="5dp"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="安卓直接访问mysql数据库"
        android:textSize="20sp"
        android:textColor="@color/black"
        android:textStyle="bold"/>

    <Button android:id="@+id/btn_queryCount"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="查询用户数量"
        android:textSize="20sp"
        android:textColor="@color/black"
        android:textStyle="bold"/>


    <TextView  android:id="@+id/tv_userCount"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="用户数量为:"
        android:textSize="20sp"
        android:textColor="@color/black"
        android:textStyle="bold"/>
</TableLayout>

 

 

点击运行

在android模拟器上点击查询用户数量,可见最下面出现一行字:数据库中的用户数量为:3

这样我们就初步连接上mysql数据库了。

如果你的模拟器上显示数据库中的用户数量为:0,下面我提供一些解决办法

1.你的数据库的表中是否写了几条数据

2.检查URL中的ip地址有没有改成自己的,数据库的名字有没有改成自己的,sql语句中的表有没有改成自己的。

3.如果都改了,查看日志(android studio中的左下角有一个小猫图标logcat)

如果提示信息(应该是黄色的部分)中有Client does not support authentication protocol requested by server...,请参考第四大步对MySQL的操作

如果提示信息(应该是黄色的部分)中有Unknown initial character set index '255' received from server. Initial client character,这是字符集的问题,你的URL中应该没有写"useUnicode=true&characterEncoding=utf8"这部分,把这句话添加上去的时候记得在"useUnicode"前加“&”字符,表示 和 的意思

如果使用的驱动版本是8.x的,请把String CLS="com.mysql.jdbc.Driver"改成String CLS="com.mysql.cj.jdbc.Driver"

这就是我的学习记录,感谢你的观看。

posted on 2024-12-20 02:36  leapss  阅读(370)  评论(1)    收藏  举报