Android JDBC not working: ClassNotFoundException on driver
Does JDBC not work with Android?
JDBC is infrequently used on Android, and I certainly would not recommend it.
IMHO, JDBC is designed for high-bandwidth, low-latency, highly-reliable network connections (e.g., desktop to database server, Web application server to database server). Mobile devices offer little of these, and none of them consistently.
If so, tell me what alternatives I should look into for remote MySQL database access.
Create a Web service around your database and access that from Android.
As side benefits, you improve security (vs. leaving your database open), can offload some business logic from the client, can better support other platforms (e.g., Web or Web-based mobile frameworks), etc.
I had a TON of trouble with this for some reason. It is mentioned elsewhere that only 3.017 driver works, and since I made such detailed instructions I figured I'd share them. (My initial purpose was to give steps to reproduce error that I could use to ask a question here and elsewhere. No, I can't begin to guess why I had so much trouble now looking back)
To: Get JDBC Driver in Android app
- New Android Project - AndroidJDBCTest, Target Android4.03, minimum sdk 8 (Android 2.2), package name “com.test.AndroidJDBCTest”
- Right click on project, new folder “libs”
- Download Mysql JDBC Driver from here and extract it to your filesystem.
- Browse to the root directory after extracting and drag and drop the
jar mysql-connector-java-3.0.17-ga-bin.jar
into /libs in your project in project explorer inside Eclipse., using the default “copy” setting for the drag and drop. - Right click on the Eclipse Project, Build Path-Configure Build Path, Add JAR under libraries tab - Browse to /AndroidJDBCTest/libs and the jar file and click ok
- NOTE: It shows up now under “Referenced Libraries” node (if Eclipse is set to show it)
- Add code from here to the end of
onCreate()
- basicallyClass.forName("com.mysql.jdbc.Driver").newInstance();
- Attach Honeycomb device such as Motorola Xoom family Edition and run
Leaving aside the valid objections, you can make it work.
Firstly make sure you have a valid driver jar in you build path, I used
mysql-connector-java-5.1.7-bin.jar
Secondly, if you are trying it in the emulator and your db is on you development machine, 'localhost' is no good in the URL. You need '10.0.2.2'
My URL is :
String url = "jdbc:mysql://10.0.2.2/test";
test being my db name.
I've got a table called 'books' with a column 'title' in it
The following code works for me:
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();
}
}
Stepping through in the debugger, I see the titles in String entry