前言
??用Android studio連接Navicat Premium 16管理的mysql,我安裝的是mysql5.7.19版本,用的包是mysql-connector-java-5.1.49-bin.jar。
??在開始連接前請務(wù)必確保MySQL版本不是8.0及以上的版本?。》駝t會一直報錯無法創(chuàng)建連接。
??jar包也盡量選擇低一些的版本,高版本我沒試過,據(jù)說新版不太穩(wěn)定不支持也會報錯。
環(huán)境配置:
一,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數(shù)據(jù)庫
1.配置Android Studio
-
打開項目,導入jar包,將下載的jar包放入項目/app/libs內(nèi),右鍵,點擊Add As Library。
-
配置環(huán)境,在AndroidManifest.xml中加入以下代碼來獲取網(wǎng)絡(luò)訪問權(quán)限。
<uses-permission android:name="android.permission.INTERNET" />
2.mysql設(shè)置權(quán)限
- 在Navicat Premium 16中點擊連接選擇mysql,輸入自己的mysql密碼創(chuàng)建連接,主機或IP地址要填寫自己電腦的IPv4地址,雙擊選中。
不知道地址的可以cmd打開命令提示符,輸入ipconfig,找到自己的iPv4地址 - 管理員權(quán)限運行命令提示符,進入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進行測試
創(chuàng)建表和數(shù)據(jù)
- 在Navicat Premium 16中創(chuàng)建數(shù)據(jù)庫demo,創(chuàng)建表user,再編寫幾個數(shù)據(jù),因為是測試,所以我就寫了四個屬性。
表結(jié)構(gòu)為:
表數(shù)據(jù)為:
編寫代碼進行測試
- 在Android studio中編寫代碼進行測試
??一共要編寫三個java文件:JDBCUtils,UserDao和MainActivity.java。JDBCUtils用于連接數(shù)據(jù)庫,UserDao是數(shù)據(jù)庫與前端交互類,MainActivity.java是應(yīng)用主頁面的實現(xiàn)代碼。
??本來應(yīng)該再寫一個User是信息存儲類的,但是因為這是簡單的測試就沒有寫,直接在代碼里定義好數(shù)據(jù)直接進行查詢和插入數(shù)據(jù)
JDBCUtils類:
package com.example.androidpractice.Utils;
import android.util.Log;
import java.sql.Connection;
import java.sql.DriverManager;
/**
* function: 數(shù)據(jù)庫工具類,連接數(shù)據(jù)庫用
*/
public class JDBCUtils {
private static final String TAG = "mysql-party-JDBCUtils";
private static String driver = "com.mysql.jdbc.Driver";// MySql驅(qū)動
private static String dbName = "demo";// 數(shù)據(jù)庫名稱
private static String user = "bya";// 用戶名
private static String password = "123456";// 密碼
public static Connection getConn(){
Connection connection = null;
try{
Class.forName(driver);// 動態(tài)加載類
String ip = "10.73.146.38";// 寫成本機地址,不能寫成localhost,
// 嘗試建立到給定數(shù)據(jù)庫URL的連接
connection = DriverManager.getConnection("jdbc:mysql://" + ip + ":3306/" + dbName,
user, password);
Log.d("ning","數(shù)據(jù)庫連接成功!");
}catch (Exception e){
e.printStackTrace();
Log.d("ning","數(shù)據(jù)庫連接失??!");
}
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 {
//根據(jù)傳入的賬號查詢數(shù)據(jù)庫對應(yīng)的密碼,再與傳入的密碼進行對比
public boolean loginup(String account, String password) {
Connection connection = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 獲取數(shù)據(jù)庫連接
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; // 沒有找到對應(yīng)的賬號,返回false表示登錄失敗
}
} catch (SQLException e) {
e.printStackTrace(); // 打印異常信息
return false; // 發(fā)生異常,返回false表示登錄失敗
} finally {
// 關(guān)閉資源
try {
connection.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
//插入數(shù)據(jù)
public void insert(String account, String password, String name) {
Connection connection = null;
PreparedStatement pstmt = null;
try {
// 獲取數(shù)據(jù)庫連接
connection = JDBCUtils.getConn();
// 構(gòu)造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);
// 執(zhí)行SQL語句
pstmt.executeUpdate();
Log.d("ning","插入數(shù)據(jù)成功!");
} catch (SQLException e) {
e.printStackTrace(); // 打印異常信息
Log.d("ning","插入數(shù)據(jù)失敗!");
} finally {
// 關(guān)閉資源
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","登錄失敗");
}
}
}
主線程不能進行網(wǎng)絡(luò)操作問題
- 其中剛運行是還是報錯,查找了錯誤原因為:在主線程中執(zhí)行了網(wǎng)絡(luò)操作,這是不允許的。為了解決這個問題,你需要將網(wǎng)絡(luò)操作放到子線程中執(zhí)行。
- 我使用了一下代碼來解決這個報錯:
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
??這段代碼是在Android應(yīng)用中使用的,用于在Android 10(API級別29)及更高版本上啟用StrictMode。StrictMode是一個用于檢測應(yīng)用程序中可能的內(nèi)存泄漏、死鎖等問題的工具。
代碼解析:
??1,首先檢查當前設(shè)備的Android版本是否大于9(即API級別29),因為從Android 10開始,StrictMode才默認啟用。
??2,如果設(shè)備版本大于9,則創(chuàng)建一個StrictMode.ThreadPolicy對象,允許所有線程執(zhí)行。
??3,最后,使用setThreadPolicy方法將創(chuàng)建的策略設(shè)置為當前線程的策略。文章來源:http://www.zghlxwxcb.cn/news/detail-774929.html
總結(jié)
??因為才學Android沒多久,看的課程Android studio只有連接自帶的sqlite沒有通過網(wǎng)絡(luò)訪問mysql數(shù)據(jù)庫這部分,所以自己搜索著解決了一下,最后那個解決報錯的方法肯定不適用于很多情況,還需要在找一些其他方法,我問了AI說可以使用AsyncTask或者Thread來解決,但是還沒有試。
??繼續(xù)學習,加油!文章來源地址http://www.zghlxwxcb.cn/news/detail-774929.html
到了這里,關(guān)于Android studio連接mysql數(shù)據(jù)庫的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!