Android JDBC无法正常工作:驱动程序上的ClassNotFoundException

时间:2011-08-28 14:40:42

标签: java android mysql jdbc

我正在尝试在我的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数据库访问的替代方案。

感谢。

8 个答案:

答案 0 :(得分:24)

  

JDBC不适用于Android吗?

在Android上很少使用JDBC,我当然不会推荐它。

恕我直言,JDBC专为高带宽,低延迟,高可靠性的网络连接而设计(例如,桌面到数据库服务器,Web应用程序服务器到数据库服务器)。移动设备提供的内容很少,而且没有一致。

  

如果是这样,请告诉我应该考虑远程MySQL数据库访问的替代方案。

围绕您的数据库创建一个Web服务,并从Android访问它。

作为附带好处,您可以提高安全性(与打开数据库相比),可以从客户端卸载一些业务逻辑,可以更好地支持其他平台(例如,基于Web或基于Web的移动框架)等。

答案 1 :(得分:8)

出于某种原因,我有一点麻烦。 其他地方提到只有3.017驱动程序可以工作,而且由于我做了如此详细的说明,我想我会分享它们。 (我最初的目的是提供重现错误的步骤,我可以用来在这里和其他地方提出问题。不,我不能开始猜测为什么我现在回头看这么麻烦了)


收件人:在Android应用中获取JDBC驱动程序

  • 新Android项目 - AndroidJDBCTest,目标Android4.03,最低sdk 8(Android 2.2),包名“com.test.AndroidJDBCTest”
  • 右键单击项目,新文件夹“libs”
  • here下载Mysql JDBC驱动程序并将其解压缩到您的文件系统。
  • 在解压缩后,浏览到根目录,然后使用拖放的默认“复制”设置将jar mysql-connector-java-3.0.17-ga-bin.jar拖放到Eclipse项目资源管理器项目中的/ libs中。
  • 右键单击Eclipse项目,构建路径 - 配置构建路径,在库选项卡下添加JAR - 浏览到/ AndroidJDBCTest / libs和jar文件,然后单击确定
  • 注意:它现在显示在“Referenced Libraries”节点下(如果Eclipse设置为显示它)
  • 将代码从here添加到onCreate()的末尾 - 基本上Class.forName("com.mysql.jdbc.Driver").newInstance();
  • 安装Motorola Xoom系列版等Honeycomb设备并运行

答案 2 :(得分:4)

不考虑有效的异议, 可以 使其有效。

首先确保你在构建路径中有一个有效的驱动程序jar,我用

mysql-connector-java-5.1.7-bin.jar

其次,如果你在模拟器中尝试它并且你的数据库在你的开发机器上,那么'localhost'在URL中是不好的。你需要'10 .0.2.2'

我的网址是:

String url = "jdbc:mysql://10.0.2.2/test";

测试我的数据库名称。

我有一张名为'books'的表格,里面有一个“标题”栏目

以下代码适用于我:

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条目中看到标题

答案 3 :(得分:3)

理论上你应该能够做到这一点。您需要在项目中包含MySQL JDBC驱动程序Jar以使您的代码正常工作(here是一个类似的解决方案帖子)。

但它可能是not a good idea。如果通过服务器上的专用(REST)API公开数据库内容,那就更好了。

他们并没有在链接中给出理由,但是直接暴露数据库的一个主要原因之一是出于安全考虑。你的大多数用户都会表现得很好,只做他们应该用手机做的事情,但想象一下却没有。

如果他有一个有效的数据库登录,那么他/她可能只是连接到你的数据库,做各种SELECT,甚至可能在权限允许的情况下更改/销毁数据。

这就是为什么你应该在中间使用一个Web服务器来验证和清理来自用户的任何请求,以确保只能从你的MySQL数据库中检索你想要分发的数据。

答案 4 :(得分:0)

确保已将连接器放在项目的库文件夹中。 把它放在那里,它将解决问题

答案 5 :(得分:0)

如果您使用的是Android Studio, 将此行添加到gradle依赖项中就可以了。

 compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.44'

您可以根据需要更改版本。

添加此内容后,gradle同步将处理所有事情,您只需以与在简单的Java jdbc程序中相同的方式连接到DB。

答案 6 :(得分:0)

提供的参数并不总是正确的。有些人会想到可以通过JDBC使用的嵌入式db驱动程序。示例是Apache Derby和H2。 This answer证明了可以使用jdbc。

答案 7 :(得分:-1)

尝试更改gradle文件

 targetSdkVersion 8