Android JDBC 不工作:驱动程序上的 ClassNotFoundException
Posted
技术标签:
【中文标题】Android JDBC 不工作:驱动程序上的 ClassNotFoundException【英文标题】:Android JDBC not working: ClassNotFoundException on driver 【发布时间】:2011-11-05 12:04:30 【问题描述】:我正在尝试在我的 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 数据库访问寻找哪些替代方案。
谢谢。
【问题讨论】:
您的解决方案在这里:***.com/questions/15756230/… 尝试更改 gradle 文件 targetSdkVersion 8 【参考方案1】:JDBC 不适用于 Android 吗?
JDBC 在 Android 上很少使用,我当然不会推荐它。
恕我直言,JDBC 专为高带宽、低延迟、高度可靠的网络连接而设计(例如,桌面到数据库服务器、Web 应用程序服务器到数据库服务器)。移动设备提供的这些功能很少,而且没有一个始终如一。
如果是这样,请告诉我应该为远程 MySQL 数据库访问寻找哪些替代方案。
围绕您的数据库创建一个 Web 服务并从 Android 访问它。
作为附带好处,您可以提高安全性(相对于让您的数据库保持打开状态),可以从客户端卸载一些业务逻辑,可以更好地支持其他平台(例如,Web 或基于 Web 的移动框架)等等。
【讨论】:
是的,我决定使用基于 Web 的解决方案。 这个线程很老了,但我想分享一下,有必要将连接代码和其余部分放在异步线程中,而不是在主线程中,否则 Android 会阻碍它。现在我的连接正常了。【参考方案2】:出于某种原因,我遇到了很多麻烦。 其他地方提到只有 3.017 驱动程序有效,因为我做了如此详细的说明,我想我会分享它们。 (我最初的目的是给出重现错误的步骤,我可以用这些步骤在这里和其他地方提出问题。不,我无法开始猜测为什么现在回想起来会遇到这么多麻烦)
To:在 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();
连接 Honeycomb 设备,例如 Motorola Xoom family Edition 并运行
【讨论】:
【参考方案3】:抛开有效的反对意见,您可以让它发挥作用。
首先确保您的构建路径中有一个有效的驱动程序 jar,我使用了
mysql-connector-java-5.1.7-bin.jar
其次,如果您在模拟器中尝试它并且您的数据库在您的开发机器上,那么“localhost”在 URL 中是不好的。你需要'10.0.2.2'
我的网址是:
String url = "jdbc:mysql://10.0.2.2/test";
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();
在调试器中单步执行,我在字符串条目中看到了标题
【讨论】:
【参考方案4】:理论上你应该可以做到。您需要在项目中包含 MySQL JDBC 驱动程序 Jar 以使您的代码工作(here 是一个类似的解决方案帖子)。
但它可能是not a good idea。最好通过服务器上的专用 (REST) API 公开数据库内容。
他们并没有在链接中给出真正的理由,但直接公开数据库是一个坏主意的主要原因之一是出于安全考虑。您的大多数用户都会表现得很好,只做他们应该用手机做的事情,但想象一下,他们不会这样做。
如果他拥有您的数据库的有效登录名,那么他/她可能会简单地连接到您的数据库,执行各种 SELECT,或者如果权限允许他甚至可能更改/销毁数据。
这就是为什么您应该在中间有一个网络服务器来验证和清理来自用户的任何请求,以确保只有您打算分发的数据可以从您的 MySQL 数据库中检索到。
【讨论】:
【参考方案5】:如果您使用 Android Studio 进行开发, 将此行添加到您的 gradle 依赖项中会产生神奇的效果。
compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.44'
您可以根据需要更改版本。
添加后,gradle sync 将处理所有事情,您只需像在简单的 java jdbc 程序中一样连接到 DB。
【讨论】:
【参考方案6】:确保您已将连接器放置在项目的库文件夹中。 把它放在那里,它会解决问题
【讨论】:
【参考方案7】:提供的参数并不总是正确的。有些人可以想到通过 JDBC 工作的嵌入式 db 驱动程序。例如 Apache Derby 和 H2。 This answer 证明了使用 jdbc 的能力。
【讨论】:
【参考方案8】:尝试更改 gradle 文件
targetSdkVersion 8
【讨论】:
以上是关于Android JDBC 不工作:驱动程序上的 ClassNotFoundException的主要内容,如果未能解决你的问题,请参考以下文章