[英]Android JDBC not working: ClassNotFoundException on driver
我正在嘗試在我的 Android 應用程序中使用 JDBC 連接到遠程數據庫以執行插入、查詢等。我已經成功地連接並在不同的 JAVA 項目中完成了這些事情。 所以我想既然 Android 是 Java,我就可以移植相關代碼,為驅動程序添加相同的構建路徑等。但它給了我錯誤:
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
我真的不認為這是代碼問題,因為相同的代碼適用於 Java 項目(我只是在 main() 中執行)。 但作為參考,這里是:
String url = "jdbc:mysql://localhost:3306/eventhub_test"; //
String user = "root";
String pass = "";
SQLUtils sqlu = new SQLUtils(url, user, pass);
//我創建的SQLUtils類:
public class SQLUtils {
private String CONNECTION_URL;
private String user;
private String pass;
private java.sql.Statement stmt;
private java.sql.Connection conn;
public SQLUtils(String conn_url, String user, String pass) {
this.CONNECTION_URL = conn_url;
this.user = user;
this.pass = pass;
}
public void init() throws IllegalAccessException, InstantiationException, ClassNotFoundException, SQLException {
Class.forName ("com.mysql.jdbc.Driver").newInstance ();
conn = DriverManager.getConnection(CONNECTION_URL, user, pass);
stmt = conn.createStatement();
}
}
所以我真的很困惑。 JDBC 不適用於 Android 嗎? 如果是這樣,請告訴我應該為遠程 MySQL 數據庫訪問尋找哪些替代方案。
謝謝。
JDBC 不適用於 Android 嗎?
JDBC 在 Android 上很少使用,我當然不會推薦它。
恕我直言,JDBC 是為高帶寬、低延遲、高度可靠的網絡連接而設計的(例如,桌面到數據庫服務器、Web 應用程序服務器到數據庫服務器)。 移動設備提供的這些很少,而且沒有一個是一致的。
如果是這樣,請告訴我應該為遠程 MySQL 數據庫訪問尋找哪些替代方案。
圍繞您的數據庫創建一個 Web 服務並從 Android 訪問它。
作為附帶的好處,您可以提高安全性(相對於讓數據庫保持打開狀態),可以從客戶端卸載一些業務邏輯,可以更好地支持其他平台(例如,Web 或基於 Web 的移動框架)等。
由於某種原因,我在這方面遇到了很多麻煩。 在別處提到只有 3.017 驅動程序有效,而且由於我做了如此詳細的說明,我想我會分享它們。 (我最初的目的是給出重現錯誤的步驟,我可以用它來在這里和其他地方提出問題。不,我無法開始猜測為什么我現在回想起來有這么多麻煩)
至:在 Android 應用程序中獲取 JDBC 驅動程序
jar mysql-connector-java-3.0.17-ga-bin.jar
到 Eclipse 中項目資源管理器中項目的 /libs 中,使用默認的“復制”設置拖放。onCreate()
的末尾 - 基本上是Class.forName("com.mysql.jdbc.Driver").newInstance();
撇開有效的反對意見不談,你可以讓它發揮作用。
首先確保您的構建路徑中有一個有效的驅動程序 jar,我使用過
mysql-connector-java-5.1.7-bin.jar
其次,如果您在模擬器中嘗試它並且您的數據庫在您的開發機器上,則 URL 中的“localhost”是不好的。 你需要'10.0.2.2'
我的網址是:
String url = "jdbc:mysql://10.0.2.2/test";
測試是我的數據庫名稱。
我有一張名為“books”的表,其中有一列“title”
以下代碼對我有用:
public void init() throws IllegalAccessException, InstantiationException,
ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver").newInstance();
try {
conn = DriverManager.getConnection(CONNECTION_URL, user, pass);
} catch (java.sql.SQLException e1) {
e1.printStackTrace();
}
try {
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT title FROM books");
String entry;
while (rs.next()){
entry = rs.getString(1);
}
rs.close();
stmt.close();
conn.close();
} catch (java.sql.SQLException e) {
e.printStackTrace();
}
}
在調試器中逐步執行,我在 String 條目中看到了標題
理論上你應該能夠做到這一點。 您需要在您的項目中包含 MySQL JDBC 驅動程序 Jar 才能使您的代碼工作( 這里有一個類似的解決方案)。
但這可能不是一個好主意。 如果您通過服務器上的專用 (REST) API 公開數據庫內容會更好。
他們並沒有在鏈接中真正給出原因,但直接公開數據庫是個壞主意的主要原因之一是出於安全考慮。 你的大多數用戶都會表現得很好,只會做他們應該用手機做的事情,但想象一下,有人不會。
如果他有您的數據庫的有效登錄名,那么他/她可能只是連接到您的數據庫,執行各種選擇,或者如果權限允許他甚至可能更改/銷毀數據。
所以這就是為什么你應該在中間設置一個 web 服務器來驗證和清理來自用戶的任何請求,以確保只有你打算分發的數據才能從你的 MySQL 數據庫中檢索到。
如果您正在使用 Android Studio 進行開發,那么將這一行添加到您的 gradle 依賴項中會很神奇。
compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.44'
您可以根據需要更改版本。
添加這個之后,gradle sync 會處理一切,你只需要像在一個簡單的 java jdbc 程序中一樣連接到數據庫。
確保您已將連接器放置在項目的庫文件夾中。 把它放在那里,它會解決問題
提供的參數並不總是正確的。 有些人可以想到通過 JDBC 工作的嵌入式數據庫驅動程序。 例如 Apache Derby 和 H2。 這個答案證明了使用 jdbc 的能力。
嘗試更改 gradle 文件
targetSdkVersion 8
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.