Android連接MySQL數(shù)據(jù)庫的方法以及可能會遇到的一些問題

由于在畢業(yè)設(shè)計(jì)中需要用到Android訪問MySQL數(shù)據(jù)庫,便有了以下這篇文章。
Android連接數(shù)據(jù)庫一般有兩種方法:
(1)通過服務(wù)器連接,利用服務(wù)器對數(shù)據(jù)庫進(jìn)行增刪改查等操作,這是最常用的方式。學(xué)有余力的小伙伴可以去查閱《Android和PHP開發(fā)最佳實(shí)踐》這本書,它以一個完整的微博應(yīng)用項(xiàng)目實(shí)例為主線,由淺入深地講解了Android客戶端開發(fā)和PHP服務(wù)端開發(fā)的思路和技巧。介于本人是一個Tomcat和PHP都不會的廢物,因此放棄了這種方式,采取了另一種方式;
咳咳,以上都是過去式啦,最新文章可以到置頂評論去看吶。另外,代碼也在Gitee上開源了,同樣到評論區(qū)領(lǐng)取哦。
(2)在Android內(nèi)部直接訪問MySQL數(shù)據(jù)庫。這種方式非常耗手機(jī)內(nèi)存,而且容易被反編譯造成安全隱患,所以在實(shí)際項(xiàng)目中不推薦使用。本文將介紹直接訪問的方法以及一些可能會遇到的問題。

一、準(zhǔn)備
想要在Android工程中實(shí)現(xiàn)直接連接MySQL的話需要先導(dǎo)入jar包。在main文件夾下新建一個名為libs的文件夾,將jar包添加到里面。jar包在百度網(wǎng)盤中分享了,有需要的小伙伴可以私聊up獲取。

添加好之后右擊,選擇Add As Library…

之后在build.gradle文件中會出現(xiàn):

這就說明依賴已經(jīng)導(dǎo)入成功了。
一定要記得在權(quán)限列表AndroidMainfest.xml中添加請求訪問網(wǎng)絡(luò)的權(quán)限

接下來就可以開心的訪問數(shù)據(jù)庫了

定義DbUtil類來進(jìn)行數(shù)據(jù)庫的訪問

簡單的寫一個布局用來進(jìn)行數(shù)據(jù)庫訪問的測試

跟之前java開發(fā)一樣,在活動中寫一個方法來進(jìn)行數(shù)據(jù)庫的訪問

運(yùn)行程序,在EditText中輸入數(shù)據(jù)庫中的設(shè)置好的賬號和密碼,點(diǎn)擊登錄

然后,果不其然的。。。失敗了。。。
報(bào)了一個錯"com.mysqljdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server."大概意思是數(shù)據(jù)庫連接驅(qū)動版本太低,要我提高M(jìn)ySQL數(shù)據(jù)庫連接驅(qū)動的版本。
但是據(jù)了解Android直接訪問數(shù)據(jù)庫最高只能使用MySQL 5.+版本,換成MySQL 8.+后會出現(xiàn)更奇怪的錯誤。
想了好久,終于意識到訪問數(shù)據(jù)庫是一個耗時(shí)操作,直接放在主線程中跑肯定會出問題。
于是便有了一下版本,將數(shù)據(jù)庫訪問放到一個子線程中,使用handler通知主線程更新UI
運(yùn)行程序,在EditText中輸入數(shù)據(jù)庫中的設(shè)置好的賬號和密碼,點(diǎn)擊登錄

訪問成功,ヾ(??▽?)ノ撒花

上面字DbUtil類中講到電腦和手機(jī)必須連接相同的網(wǎng)絡(luò),這樣才能進(jìn)行數(shù)據(jù)庫的訪問。但是很明顯這種方法非常不方便。
在這里up推薦一個叫NATAPP的內(nèi)網(wǎng)穿透工具(不是廣告),NATAPP是連接內(nèi)外網(wǎng)的橋梁,客戶端連接NATAPP后,便可在本地運(yùn)行的服務(wù)器與公網(wǎng)之間建立起一個安全的隧道。在進(jìn)行Android開發(fā)時(shí),可以使手機(jī)APP直接與PC電腦通信,做到實(shí)時(shí)本地開發(fā)調(diào)試。
獲取一個隧道,一般免費(fèi)的就行,如果嫌麻煩可以整一個付費(fèi)的。選擇TCP協(xié)議,本地端口映射到MySQL的3306。
在下載好的natapp文件夾中新建config.ini文件,內(nèi)容配置如下圖

authtoken改成自己的就行,然后運(yùn)行natapp.exe。

將原本的ip地址和端口換成natapp分配的網(wǎng)址和自己設(shè)置的端口,運(yùn)行程序,就可以在任何網(wǎng)絡(luò)下進(jìn)行數(shù)據(jù)庫的訪問了。