簡體   English   中英

Android JDBC 不工作:驅動程序上的 ClassNotFoundException

[英]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 驅動程序

  • 新的 Android 項目 - AndroidJDBCTest,目標 Android4.03,最低 sdk 8 (Android 2.2),包名稱“com.test.AndroidJDBCTest”
  • 右鍵單擊項目,新建文件夾“libs”
  • 這里下載 Mysql JDBC 驅動程序並將其解壓縮到您的文件系統。
  • 解壓后瀏覽到根目錄,將jar mysql-connector-java-3.0.17-ga-bin.jar到 Eclipse 中項目資源管理器中項目的 /libs 中,使用默認的“復制”設置拖放。
  • 右鍵單擊 Eclipse 項目,構建路徑-配置構建路徑,在庫選項卡下添加 JAR - 瀏覽到 /AndroidJDBCTest/libs 和 jar 文件,然后單擊確定
  • 注意:它現在顯示在“參考庫”節點下(如果 Eclipse 設置為顯示它)
  • 將代碼從這里添加到onCreate()的末尾 - 基本上是Class.forName("com.mysql.jdbc.Driver").newInstance();
  • 連接 Honeycomb 設備,例如 Motorola Xoom 家庭版並運行

撇開有效的反對意見不談,你可以讓它發揮作用。

首先確保您的構建路徑中有一個有效的驅動程序 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM