前言
用Android studio连接Navicat Premium 16管理的mysql,我安装的是mysql5.7.19版本,用的包是mysql-connector-java-5.1.49-bin.jar。
在开始连接前请务必确保MySQL版本不是8.0及以上的版本!!否则会一直报错无法创建连接。
jar包也尽量选择低一些的版本,高版本我没试过,据说新版不太稳定不支持也会报错。
环境配置:
一,mysql下载地址:https://downloads.mysql.com/archives/community
二,Navicat Premium 16安装地址:https://www.downkuai.com/soft/161548.html
三,mysql-connector-java-5.1.49-bin.jar下载地址:https://downloads.mysql.com/archives/c-j/
一、Android studio连接mysql数据库
1.配置Android Studio
-
打开项目,导入jar包,将下载的jar包放入项目/app/libs内,右键,点击Add As Library。
-
配置环境,在AndroidManifest.xml中加入以下代码来获取网络访问权限。
<uses-permission android:name="android.permission.INTERNET" />
2.mysql设置权限
- 在Navicat Premium 16中点击连接选择mysql,输入自己的mysql密码创建连接,主机或IP地址要填写自己电脑的IPv4地址,双击选中。
不知道地址的可以cmd打开命令提示符,输入ipconfig,找到自己的iPv4地址
- 管理员权限运行命令提示符,进入mysql所在的文件夹进入mysql,输入密码登录你的账号,输入以下代码表示增加新用户,bya是用户名,123456是明文密码,%表示能够在任何机器上登陆mysql,
d: //进入D盘
cd D:\mysql\mysql-5.7.19-winx64\bin //进入mysql在的文件夹
mysql -u RCQ -p //登录账号 RCQ要替换为自己的用户名
123456 //输入自己的密码
GRANT ALL PRIVILEGES ON *.* TO 'bya'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
显示ok则表示添加成功
- 在Navicat Premium 16中点击用户,新建用户,用户名和密码要和刚添加mysql用户时的用户名和密码一致,最后点击保存即可。
二、在Android studio进行测试
创建表和数据
- 在Navicat Premium 16中创建数据库demo,创建表user,再编写几个数据,因为是测试,所以我就写了四个属性。
表结构为:
表数据为:
编写代码进行测试
- 在Android studio中编写代码进行测试
一共要编写三个java文件:JDBCUtils,UserDao和MainActivity.java。JDBCUtils用于连接数据库,UserDao是数据库与前端交互类,MainActivity.java是应用主页面的实现代码。
本来应该再写一个User是信息存储类的,但是因为这是简单的测试就没有写,直接在代码里定义好数据直接进行查询和插入数据
JDBCUtils类:
package com.example.androidpractice.Utils;
import android.util.Log;
import java.sql.Connection;
import java.sql.DriverManager;
/**
* function: 数据库工具类,连接数据库用
*/
public class JDBCUtils {
private static final String TAG = "mysql-party-JDBCUtils";
private static String driver = "com.mysql.jdbc.Driver";// MySql驱动
private static String dbName = "demo";// 数据库名称
private static String user = "bya";// 用户名
private static String password = "123456";// 密码
public static Connection getConn(){
Connection connection = null;
try{
Class.forName(driver);// 动态加载类
String ip = "10.73.146.38";// 写成本机地址,不能写成localhost,
// 尝试建立到给定数据库URL的连接
connection = DriverManager.getConnection("jdbc:mysql://" + ip + ":3306/" + dbName,
user, password);
Log.d("ning","数据库连接成功!");
}catch (Exception e){
e.printStackTrace();
Log.d("ning","数据库连接失败!");
}
return connection;
}
}
UserDao.java类:
package com.example.androidpractice.dao;
import android.util.Log;
import com.example.androidpractice.Utils.JDBCUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* author: 白易安
* date: 2023.08.05
* **/
public class UserDao {
//根据传入的账号查询数据库对应的密码,再与传入的密码进行对比
public boolean loginup(String account, String password) {
Connection connection = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 获取数据库连接
connection = JDBCUtils.getConn();
Log.d("ning","账号:" + account);
// 查询表中的密码
String sql = "SELECT password FROM user WHERE account = ?";
pstmt = connection.prepareStatement(sql);
pstmt.setString(1, account);
rs = pstmt.executeQuery();
if (rs.next()) {
// 比较查出的密码和传入的密码是否相同
String dbPassword = rs.getString("password");
Log.d("ning","密码:" + dbPassword);
return dbPassword.equals(password);
} else {
return false; // 没有找到对应的账号,返回false表示登录失败
}
} catch (SQLException e) {
e.printStackTrace(); // 打印异常信息
return false; // 发生异常,返回false表示登录失败
} finally {
// 关闭资源
try {
connection.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
//插入数据
public void insert(String account, String password, String name) {
Connection connection = null;
PreparedStatement pstmt = null;
try {
// 获取数据库连接
connection = JDBCUtils.getConn();
// 构造SQL语句
String sql = "INSERT INTO user (account, password, name) VALUES (?, ?, ?)";
pstmt = connection.prepareStatement(sql);
pstmt.setString(1, account);
pstmt.setString(2, password);
pstmt.setString(3, name);
// 执行SQL语句
pstmt.executeUpdate();
Log.d("ning","插入数据成功!");
} catch (SQLException e) {
e.printStackTrace(); // 打印异常信息
Log.d("ning","插入数据失败!");
} finally {
// 关闭资源
try {
connection.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
}
MainActivity.java:
package com.example.androidpractice;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import com.example.androidpractice.dao.UserDao;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String account="17374517111";
String password="111111";
String account1="17374517444";
String password1="111111444";
String name="d";
UserDao dao=new UserDao();
boolean up=false;
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
up=dao.loginup(account,password);
dao.insert(account1,password1,name);
}
if (up==true){
Log.d("ning","登录成功");
}else {
Log.d("ning","登录失败");
}
}
}
主线程不能进行网络操作问题
- 其中刚运行是还是报错,查找了错误原因为:在主线程中执行了网络操作,这是不允许的。为了解决这个问题,你需要将网络操作放到子线程中执行。
- 我使用了一下代码来解决这个报错:
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
这段代码是在Android应用中使用的,用于在Android 10(API级别29)及更高版本上启用StrictMode。StrictMode是一个用于检测应用程序中可能的内存泄漏、死锁等问题的工具。
代码解析:
1,首先检查当前设备的Android版本是否大于9(即API级别29),因为从Android 10开始,StrictMode才默认启用。
2,如果设备版本大于9,则创建一个StrictMode.ThreadPolicy对象,允许所有线程执行。
3,最后,使用setThreadPolicy方法将创建的策略设置为当前线程的策略。文章来源:https://www.toymoban.com/news/detail-774929.html
总结
因为才学Android没多久,看的课程Android studio只有连接自带的sqlite没有通过网络访问mysql数据库这部分,所以自己搜索着解决了一下,最后那个解决报错的方法肯定不适用于很多情况,还需要在找一些其他方法,我问了AI说可以使用AsyncTask或者Thread来解决,但是还没有试。
继续学习,加油!文章来源地址https://www.toymoban.com/news/detail-774929.html
到了这里,关于Android studio连接mysql数据库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!